之前完成資料的新增及修改,接下來要講解怎麼對 Sharepreference 內部進行移除:點選要被刪除的資料,底下會有一個提醒選取的物件,再按右上方垃圾桶按鈕,此時會切換成醒目的白色、暗示使用者它可以被點擊,點擊刪除後會更新畫面。
使用: Checkbox、Enable屬性、顏色切換、Sharepreference.remove()
看 Kotlin Everywhere 範例做刪除功能的程式碼滿複雜的,主要是步驟和細節多、花較長時間才看懂並弄出來,預計拆成兩篇來講解:
首先每筆資料要新增一個按鈕,itemView 會多一個 CheckBox,預設不勾選(false)
有了這個之後就可以到 Adapter 綁定它的畫面元件及點擊功能
inner class ViewHolder(v: View):RecyclerView.ViewHolder(v){
...
val chk_delete = v.findViewById<CheckBox>(R.id.chk_delete)
設定點擊功能,可以到 Day 20 ─給RecyclerView Item添加點擊事件複習是如何運用,之前已經在 interface 設定一個 toEdit() 方法,把 img_edit
按鈕設的點擊事件和接口這個方法連結,以便於外部可以呼叫到,現在就依樣畫葫蘆,繼續在 interface 下加一個 toSelect() 方法,把它連結 chk_delete
的點擊事件:
interface ItemClickListener{ //自定義 ItemClickListener 介面,可以溝通外部
fun toEdit(edit: Thing)
fun toSelect(edit: Thing) //新增方法
}
fun bind(thing: Thing){
tv_todo.setText(thing.todo)
img_edit.setOnClickListener{
itemClickListener?.toEdit(thing)
}
chk_delete.setOnClickListener{ //為 chk_delete設定點擊事件
itemClickListener?.toSelect(thing)
}
}
於是我們 override,等下要放點擊之後真正要做的事
Myadapter.setToEditClickListener(object : MyAdapter.ItemClickListener{
override fun toEdit(event: Thing) {
EditEvent(event)
}
override fun toSelect(event: Thing) {
//待會再寫
}
})
加一個刪除的 menu_item,自定義垃圾桶樣式,可以到 flaticon 搜尋儲存成 SVG 檔,再上傳成 Vector Asset
注意指定樣式之外,先預設按鈕不能被點擊(false)
刪除按鈕的預設是不能被點擊,我們設定當資料的 Checkbox 被勾選之後,無論是哪一筆資料、只要有被勾選,刪除按鈕就會切換成可被點擊(true)。
isSelected
,屬性是布林值,預設 falsedata class Thing
(val key: String, var todo : String, var isSelected : Boolean = false)
isChecked
畫面狀態連結資料的 isSelected
資料屬性
fun bind(thing: Thing){
...
...
chk_delete.isChecked = thing.isSelected //畫面狀態 == 資料狀態
chk_delete.setOnClickListener{
itemClickListener?.toSelect(thing)
}
}
讓 toSelect 執行函式 SelectEvent:
override fun toSelect(event: Thing) {
SelectEvent(event)
}
✔ 函式 SelectEvent
把點擊 Checkbox 要做的事情寫出來,選取之後雖是利用 interface 呼叫 Adapter 綁的 CheckBox 點擊事件,但真正做的事情還是寫在 MainActivity.kt 裡面,步步弄下來,還真是繞一大圈XD
我讓 CheckBox 選取之後要做的三件事情,寫在函式 SelectEvent 裡:
isSelected
屬性狀態private fun SelectEvent(event: Thing){
#1 event.isSelected = !event.isSelected
#2 Toast.makeText(this, "你選取「${event.todo}」",Toast.LENGTH_SHORT).show()
#3 itemDelete.isEnabled = things.find { it.isSelected }?.isSelected ?: false
}
isSelected
屬性狀態event.isSelected = true
,因為有可能使用者點了之後又不想刪除,會再點一次取消勾選,所以只能說點擊之後「狀態相反」event.isSelected = !event.isSelected
跑一次模擬器和 debug 就會懂了,剛點選時的初始狀態是灰色字 isSelected=false,跑過那一行之後就會變成橘色字 isSelected=true
Thing(var todo : String)
Toast.makeText(this, "你選取「${event.todo}」",Toast.LENGTH_SHORT).show()
至於第三件事情,勾選 CheckBox 時讓右上角垃圾桶改變 enable 狀態,除了狀態還要更動顏色,以及刪除 Sharepreference 資料的指令,明天會繼續講解~