DiffUtil 和 registerAdapterDataObserver

Maj*_*eee 3 android kotlin android-recyclerview reactive rx-java2

我有一个带有 DiffUtil 功能的 RecyclerView 适配器。当 DiffUtil 完成其魔法时,我想使用 DataObserver 来通知片段。但是,看起来 DiffUtil 不会调用观察者。

适配器

private val items: MutableList<Message>
private val updater = PublishSubject.create<MutableList<Message>>()

init {
    items = ArrayList()

    updater
        .debounce(500, TimeUnit.MILLISECONDS)
        .subscribeOn(Schedulers.computation())
        .map { Pair(it, DiffUtil.calculateDiff(DiffUtilCallback(it, items), true)) }
        .doOnNext { setItems(it.first) }
        .map { it.second }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { diffResult.dispatchUpdatesTo(this) }
}

fun updateData(msgs: MutableList<Message>) = updater.onNext(msgs)

private fun setItems(newItems: MutableList<Message>) {
    items.clear()
    items.addAll(newItems)
}
Run Code Online (Sandbox Code Playgroud)

分段

adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
    override fun onChanged() {
        //is not called
    }
})
Run Code Online (Sandbox Code Playgroud)

如何使 AdapterDataObserver 工作?我的(试图做出反应)方法有什么问题?

Maj*_*eee 8

我发现了问题所在。我假设onChanged()每次发生变化时都会调用它。但它是1:1notify方法。

所以notifyDatasetChanged()所调用onChanged(),但DiffUtil永远不会调用它(即DiffUtil的目的),这意味着所有其他的方法(onItemRangeRemoved()onItemRangeMoved()等)得来实现。

  • 当通过“DiffUtil”添加/删除单个项目时,您如何处理更新现有项目位置的情况? (2认同)