項目地址binding-adapter
多數(shù)情況使用列表都需要動態(tài)刷新列表中的數(shù)據(jù)刑巧,
一般情況下都是手動計算數(shù)據(jù)變化范圍并調(diào)用adapter.notifyXXXX()演熟,
而當(dāng)集成了DataBinding的時候我們有了更簡單強大的方案
直接利用DataBinding的ObservableList五芝,只需把List變化成ObservableList瓶逃,并添加一個通用的監(jiān)聽器,無需的對adapter進(jìn)行改造稽犁,實現(xiàn)真正的即插即用啥容。
ObservableList幫助我們計算了數(shù)據(jù)的變化并提供了監(jiān)聽方法。
1.將參數(shù)list使用ObservableList代替
val list: ObservableList<String> = ObservableArrayList()
val adapter = BindingAdapter(ItemSimpleBinding::inflate, list) { position, item ->
binding.title.text = "[$position] $item"
}
2.實現(xiàn)通用的OnListChangedNotifier,完成變更通知adapter诵闭。
為了保持庫的輕量炼团,沒有包含在庫中,需要可以自行從Demo中拷貝疏尿。
class OnListChangedNotifier<T >(
val adapter: RecyclerView.Adapter<*>,
) : OnListChangedCallback<ObservableList<T>>() {
@SuppressLint("NotifyDataSetChanged")
override fun onChanged(sender: ObservableList<T>) {
adapter.notifyDataSetChanged()
}
override fun onItemRangeChanged(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
adapter.notifyItemRangeChanged(positionStart, itemCount)
}
override fun onItemRangeInserted(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
adapter.notifyItemRangeInserted(positionStart, itemCount)
}
override fun onItemRangeMoved(
sender: ObservableList<T>,
fromPosition: Int,
toPosition: Int,
itemCount: Int
) {
for (i in 0 until itemCount) {
adapter.notifyItemMoved(fromPosition + i, toPosition + i)
}
}
override fun onItemRangeRemoved(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
adapter.notifyItemRangeRemoved(positionStart, itemCount)
}
}
3.綁定list和adapter
list.addOnListChangedCallback(OnListChangedNotifier(adapter))