使用ObservableList代替自动adapter.noti
2021-11-22 本文已影响0人
luowenbin
项目地址binding-adapter
多数情况使用列表都需要动态刷新列表中的数据,
一般情况下都是手动计算数据变化范围并调用adapter.notifyXXXX(),
而当集成了DataBinding的时候我们有了更简单强大的方案
直接利用DataBinding的ObservableList,只需把List变化成ObservableList,并添加一个通用的监听器,无需的对adapter进行改造,实现真正的即插即用。
ObservableList帮助我们计算了数据的变化并提供了监听方法。
1.将参数list使用ObservableList代替
val list: ObservableList<String> = ObservableArrayList()
val adapter = BindingAdapter(ItemSimpleBinding::inflate, list) { position, item ->
binding.title.text = "[$position] $item"
}
2.实现通用的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))