使用ObservableList代替自动adapter.notifyXXXX刷新列表

项目地址binding-adapter

多数情况使用列表都需要动态刷新列表中的数据,
一般情况下都是手动计算数据变化范围并调用adapter.notifyXXXX(),
而当集成了DataBinding的时候我们有了更简单强大的方案
直接利用DataBinding的ObservableList,只需把List变化成ObservableList,并添加一个通用的监听器,无需的对adapter进行改造,实现真正的即插即用。
ObservableList帮助我们计算了数据的变化并提供了监听方法。

1.将参数list使用ObservableList代替

val list: ObservableList = ObservableArrayList()

val adapter = BindingAdapter(ItemSimpleBinding::inflate, list) { position, item ->
    binding.title.text = "[$position] $item"
}

2.实现通用的OnListChangedNotifier,完成变更通知adapter。

为了保持库的轻量,没有包含在库中,需要可以自行从Demo中拷贝。

class OnListChangedNotifier(
    val adapter: RecyclerView.Adapter<*>,
) : OnListChangedCallback>() {

    @SuppressLint("NotifyDataSetChanged")
    override fun onChanged(sender: ObservableList) {
        adapter.notifyDataSetChanged()
    }

    override fun onItemRangeChanged(
        sender: ObservableList,
        positionStart: Int,
        itemCount: Int
    ) {
        adapter.notifyItemRangeChanged(positionStart, itemCount)
    }

    override fun onItemRangeInserted(
        sender: ObservableList,
        positionStart: Int,
        itemCount: Int
    ) {
        adapter.notifyItemRangeInserted(positionStart, itemCount)
    }

    override fun onItemRangeMoved(
        sender: ObservableList,
        fromPosition: Int,
        toPosition: Int,
        itemCount: Int
    ) {
        for (i in 0 until itemCount) {
            adapter.notifyItemMoved(fromPosition + i, toPosition + i)
        }
    }

    override fun onItemRangeRemoved(
        sender: ObservableList,
        positionStart: Int,
        itemCount: Int
    ) {
        adapter.notifyItemRangeRemoved(positionStart, itemCount)
    }


}

3.绑定list和adapter

list.addOnListChangedCallback(OnListChangedNotifier(adapter))

你可能感兴趣的:(使用ObservableList代替自动adapter.notifyXXXX刷新列表)