iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

Kotlin Everyday:新手寫程式踩的坑系列 第 23

Day 23 ─用 Kotlin 做待辦清單 Todolist(6) 刪除 Sharepreference 資料 (上)

  • 分享至 

  • xImage
  •  

之前完成資料的新增及修改,接下來要講解怎麼對 Sharepreference 內部進行移除:點選要被刪除的資料,底下會有一個提醒選取的物件,再按右上方垃圾桶按鈕,此時會切換成醒目的白色、暗示使用者它可以被點擊,點擊刪除後會更新畫面。

使用: Checkbox、Enable屬性、顏色切換、Sharepreference.remove()

看 Kotlin Everywhere 範例做刪除功能的程式碼滿複雜的,主要是步驟和細節多、花較長時間才看懂並弄出來,預計拆成兩篇來講解:

一、新增 CheckBox

  1. 首先每筆資料要新增一個按鈕,itemView 會多一個 CheckBox,預設不勾選(false)

  2. 有了這個之後就可以到 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)
    }
}
  1. 這時候回到 MainActivity.kt,會看到 object 顯示紅色底警示,提醒我們還有一個方法必須實作,那就是 toSelect()

於是我們 override,等下要放點擊之後真正要做的事

Myadapter.setToEditClickListener(object : MyAdapter.ItemClickListener{
    
    override fun toEdit(event: Thing) {
        EditEvent(event)
    }
    override fun toSelect(event: Thing) {
        //待會再寫            
    }
})

二、新增刪除垃圾桶

  1. 加一個刪除的 menu_item,自定義垃圾桶樣式,可以到 flaticon 搜尋儲存成 SVG 檔,再上傳成 Vector Asset

  2. 注意指定樣式之外,先預設按鈕不能被點擊(false)

三、在 Thing 資料型態新增屬性

刪除按鈕的預設是不能被點擊,我們設定當資料的 Checkbox 被勾選之後,無論是哪一筆資料、只要有被勾選,刪除按鈕就會切換成可被點擊(true)。

  1. 為了判斷 CheckBox 狀態,給 Thing 資料型態新增一變數 isSelected,屬性是布林值,預設 false
data class Thing
(val key: String, var todo : String, var isSelected : Boolean = false)
  1. 在用來連結畫面和資料的 Adapter 裡,將 CheckBox 的 isChecked 畫面狀態連結資料的 isSelected 資料屬性
fun bind(thing: Thing){
    ...
    ...
    chk_delete.isChecked = thing.isSelected    //畫面狀態 == 資料狀態
    chk_delete.setOnClickListener{
        itemClickListener?.toSelect(thing)
    }
}

四、實作 toSelect 方法

讓 toSelect 執行函式 SelectEvent:

override fun toSelect(event: Thing) {
        SelectEvent(event)
    }

✔ 函式 SelectEvent
把點擊 Checkbox 要做的事情寫出來,選取之後雖是利用 interface 呼叫 Adapter 綁的 CheckBox 點擊事件,但真正做的事情還是寫在 MainActivity.kt 裡面,步步弄下來,還真是繞一大圈XD

我讓 CheckBox 選取之後要做的三件事情,寫在函式 SelectEvent 裡:

  • 勾選 CheckBox 時,改變 isSelected 屬性狀態
  • 勾選 CheckBox 時,跳一個 Toast 提示訊息
  • 勾選 CheckBox 時,讓右上角垃圾桶改變 enable 狀態,可被點擊
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
    }
  1. 改變 isSelected 屬性狀態
    預設是 false,所以勾選 CheckBox 後變成 true,但不能夠直接寫event.isSelected = true,因為有可能使用者點了之後又不想刪除,會再點一次取消勾選,所以只能說點擊之後「狀態相反
event.isSelected = !event.isSelected

跑一次模擬器和 debug 就會懂了,剛點選時的初始狀態是灰色字 isSelected=false,跑過那一行之後就會變成橘色字 isSelected=true

  1. 跳一個 Toast 提示訊息
    Thing(var todo : String)
    勾選 CheckBox 時,跳一個 Toast 訊息提醒使用者選取的項目,顯示資料的文字內容:
Toast.makeText(this, "你選取「${event.todo}」",Toast.LENGTH_SHORT).show()

至於第三件事情,勾選 CheckBox 時讓右上角垃圾桶改變 enable 狀態,除了狀態還要更動顏色,以及刪除 Sharepreference 資料的指令,明天會繼續講解~


上一篇
Day 22 ─用 Kotlin 做待辦清單 Todolist(5) 區分新增及編輯模式
下一篇
Day 24 ─用 Kotlin 做待辦清單 Todolist(7) 刪除 Sharepreference 資料 (下)
系列文
Kotlin Everyday:新手寫程式踩的坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言