最近在寫一個練習一個 sideproject 實遇到需要當使用者更新資料時,要同時更新資料至 RecyclerView 上的情況。作法有許多種,透過幾個大神的題點,第一次使用了 interface 來做操作。趁著記憶猶新趕快記下來。
我們希望當使用者加入新資料到 ArrayList 的時候,我們可以將這個 ArrayList 取代 Adapter 中舊有的 ArrayList 換掉,並提醒 Adapter 有資料更新。
有了以上想法後,我們更進一步的思考,如果我們有許多畫面需要更新那該如何實作呢?
我們這裡的作法是,我們透過建立 interface 裡面有一個更新畫面的 function。
再將所有需要更新畫面的 adapter 都繼承該 interface ,並 override 其 function 。
然後將所有有繼承該 interface 的類別用一個 list 儲存起來。方便統一導入新 list 。
首先我們先建立一個 interface 它裡面定義一個 function 需要傳入新的 ArrayList
interface UpdateData {
fun dataChange(newDataList: ArrayList<NameData>) {
}
}
然後我們在 Adapter 裡繼承這個 interface 並且將新的 ArrayList 取代舊的。
class NameAdapter(var nameList: ArrayList<NameData>):RecyclerView.Adapter<NameAdapter.ViewHolder>(),UpdateData {
.
.
.
.
.
override fun dataChange(newDataList: ArrayList<NameData>) {
this.nameList = newDataList
notifyDataSetChanged()
}
}
接著,我們在 MainActivity 裡把這個 Adapter 加入一個存放所有有繼承該 interface 的 ArrayList 裡(但這個例子裡只有一個)。
這個動作我們,寫了一個 register function 來實現。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adapter = NameAdapter(DataService.nameList)
recyclerView.adapter = adapter
//加入 ArrayList
DataService.register(adapter)
}
看到這裡也許會感到困惑,這個 register 是怎麼來的。
就讓我們來看看 DataService 裡裝的是什麼吧。
這個 DataService 是一個 object 物件,能夠保持結構的單一性。
裡面我們就可以看到,當使用者呼叫 addName 這個 function 的同時。
我們把使用者新輸入的資料加入後,也一並將 List 更新給所有有繼承這個 interface 的 adapter 。
object DataService {
var interList = arrayListOf<UpdateData>()
fun register(input: UpdateData) {
interList.add(input)
}
var nameList = arrayListOf<NameData>()
fun addName(name: String): MutableList<NameData>{
nameList.add(NameData("$name"))
for ( i in 0 until interList.size) {
interList[i].dataChange(nameList)
}
return nameList
}
}
這樣的作法能夠方便的管理多個畫面的更新。讓程式的可用性更高。
今天就先這樣囉,我們明天見。