讓 Todolist 功能更多元,使用者可以輸入待辦事項的標題、內文及日期,這些內容可以在返回主頁之後,點擊跳出一個對話框檢視,簡單來說要做的事有:
昨天完成了第一項,練習 DatePickerDialog 讓使用者可以選日期,現在待辦清單和之前版本有了很大變化,多了一個待辦事項的內容、一個日期字串,這些新加入的東西也是資料一部分,所以現在要來修正資料型態。
data class Thing(
val key: String, //原本的 Key 值
var title : String, //原本的 todo 字串,改成待辦事項-標題
var content : String, //新增待辦事項-內容
var date : String, //新增待辦事項-日期
var isSelected : //原本的 isSelected 布林值
Boolean = false
)
==function save()==
函式 save() 有設條件,區分出編輯模式和新增模式,這裡先修改新增模式的部分:
putString(Key, Value)
的 Value 值var i = 0
while (!sharedPreferences.getString("todo-${i}", "").isNullOrEmpty()){
i++
} //Key值 //待辦事項-標題 //待辦事項-內容 //待辦事項-日期
val todo = Thing("todo-${i}", "${ed_title.text}", "${ed_content.text}", "${tv_date.text}")
val todoJson = Gson().toJson(todo) //包成Json()字串符
editor.putString("todo-${i}", todoJson).apply()
檢查一下,確認有沒有存入全部資料
==function getEvent()==
因為資料儲存時被轉成 Json() 字串符,取資料的時候要把它轉回來、放入 things 陣列裡
// for(key in todolist){
// val thing = Thing(key, sharedPreferences.getString(key, "")!!)
// things.add(thing) //將Thing兩個性質都取得
// }
for(key in todolist){
val todoJson = sharedPreferences.getString(key, "")
val todo = Gson().fromJson(todoJson, Thing::class.java)
things.add(todo)
}
設定點擊功能已經寫過了,可在 Day 20 ─給 RecyclerView Item 添加點擊事件複習是如何運用,繼續在 interface 新增一個 toShow() 方法,讓物件的點擊事件可以和 interface 這個方法連結,以便於從外部呼叫:
綁定 RecyclerView 畫面元件
呼叫 ViewHolder 建構式,必須提供 RecyclerView 其中一個選項的View,像是下方程式碼綁定的 tv_todo
、img_edit
和 chk_delete
等等,這樣才能對他們做點擊事件
inner class ViewHolder(v: View):RecyclerView.ViewHolder(v){
val tv_todo = v.findViewById<TextView>(R.id.tv_todo)
val img_edit = v.findViewById<ImageView>(R.id.img_edit)
val chk_delete = v.findViewById<CheckBox>(R.id.chk_delete)
fun bind(thing: Thing){
tv_todo.setText(thing.title)
img_edit.setOnClickListener{...}
chk_delete.isChecked = thing.isSelected
chk_delete.setOnClickListener{...}
}
}
直接呼叫整個 itemView
對其做點擊事件:這樣無論使用者點到 item 哪各部分,都會作用
Public constructors |
---|
RecyclerView.ViewHolder(View itemView) |
itemView.setOnClickListener {
itemClickListener?.toShow(thing)
}
一樣在 MainActivity 裡面會被要求 override 方法 toShow(),讓它執行函式 ShowEvent()
override fun toShow(event: Thing) {
ShowEvent(event)
}
==function ShowEvent()==
函式 ShowEvent() 要執行的是跳出 AlertDialog 對話框,顯示資料的標題、內容、日期和一個確認按鈕,之前寫過 Day 6 ─用Kotlin做點餐介面 (4) AlertDialog,複習一下來做:
.title
、.content
、.date
等等private fun ShowEvent(event: Thing){
AlertDialog.Builder(this)
.setTitle("待辦事項:${event.title}")
.setMessage("內容: ${event.content}\n日期: ${event.date}")
.setPositiveButton("確認"){dialog, which ->
dialog.cancel()
}
.show()
}
修改資料,從主頁跳到第二頁的編輯模式,是利用 startActivityForResult(intent, 1) 夾帶資料及記錄返回點。到了編輯頁面後,和之前一樣同樣顯示原本的文字或日期,於是:
title = "編輯模式"
val eventEdit = intent.getStringExtra("event")
val event = Gson().fromJson(eventEdit, Thing::class.java)
// eventKey = event.key 註解掉之前的 code
// editText = event.todo
eventKey = event.key //取得 key 值
ed_title.setText(event.title) //取得標題
ed_content.setText(event.content) //取得內容
tv_date.text = event.date //取得日期
唯一美中不足的是,點選日曆按鈕時會顯示當前時間,而不是顯示之前指定的時間,因為我們設定 calendar.get(Calendar.time
,有點懶得改了哈哈,有機會再補充
)