昨天設迴圈來跑未知的 key 值、確認資料有被存進去,接下來要修改讀取資料的程式碼,原本我們的寫法是只會讀取到一個 key 值為 todo
的資料,先把 code 註解掉
fun getData(){
val sharedPreferences = getSharedPreferences("save", Activity.MODE_PRIVATE)
// val todo = Thing(sharedPreferences.getString("todo", "")!!)
// things.add(todo)
adapter.notifyDataSetChanged()
}
SharedPreferences.getAll()
要取得 SharedPreferences 檔案中所有資料,使用 getAll () 這個方法可以取得所有的資料,它會回傳格式為 Map 的資料,Map 集合是按照 key-value 的方式存放
val todolist : MutableMap<String, ?> = sharedPreferences.getAll()
然而我們只需要 key 值,所以就只取 key 值(.keys),這時候看到回傳 MutableSet<String!>
,也就是我們要取的東西,但要注意 set 集合有一個特性是它沒有特定順序,取出來的東西會怎麼排序無法確定,可能亂序也有可能照順序,這時候可以運用集合的一個功能--- sorted 按照自然排序來返回元素
todolist : List<String!>
裡面是全部的 key 值,並且有照順序)我們要做的,是把 key 值對應的 value 全部讀出來,並且塞進 things 陣列,同樣利用 for 迴圈來跑,最後才做 adapter 畫面更新:
fun getData(){
val sharedPreferences = getSharedPreferences("save", Activity.MODE_PRIVATE)
val todolist = sharedPreferences.all.keys.sorted()
for(todo in todolist){ //todo 是在 todolist 的 key
things.add(Thing(sharedPreferences.getString(todo, "")!!))
}
adapter.notifyDataSetChanged()
}
程式碼終於大功告成,現在來 biu 一次看看結果,哇~果然又是小毛病一堆XDD
輸入新的待辦事項後,返回主頁,會發現到前面的資料重複顯示了,但是跳出 APP 後又回復正常,這說明了 SharedPreferences 內存的資料沒有問題,有問題的地方是畫面更新的時候:
畫面更新是 Adapter 來做,Adapter 會把 things 裡面的資料和畫面綁定顯示出來,顯然,現在 things 的部分資料會每跑一次返回就多一個,因為 things 是陣列集合,我們要來了解集合的特性才知道該怎麼解決:
Kotlin 中的 List、Map、Set 資料只能讀取、不能任意修改,如果需要的話得使用 Mutablelist、Mutablemap 或 Mutableset 等函數,修改集合的方式:
我們已經使用過集合的幾個功能,像是 add()、sorted() 等等,現在要做的就是 clear 刪除元素 這個功能:
每次返回頁面,執行 function getData 時,我們都會再加入 SharedPreferences 所有資料一次,而舊的資料還留在 things 陣列集合裡,才會導致前面資料會重複顯示、但重開程式的初始畫面又歸於正常,所以~只需要「在加入資料之前先清掉 things 陣列的原有內容,因為他們全部會被重新添加」這個動作,畫面就沒問題囉!
things.clear() //重新添加之前,清掉things舊的資料
val todolist = sharedPreferences.all.keys.sorted()
for(todo in todolist){
things.add(Thing(sharedPreferences.getString(todo, "")!!))
}