DiffUtil 和 registerAdapterDataObserver

Posted

技术标签:

【中文标题】DiffUtil 和 registerAdapterDataObserver【英文标题】:DiffUtil and registerAdapterDataObserver 【发布时间】:2018-10-26 12:28:51 【问题描述】:

我有一个具有 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)

片段

adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() 
    override fun onChanged() 
        //is not called
    
)

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

【问题讨论】:

【参考方案1】:

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

所以notifyDatasetChanged() 调用onChanged(),但 DiffUtil 从未调用它(这就是 DiffUtil 的目的),这意味着所有其他方法(onItemRangeRemoved()onItemRangeMoved() 等)都必须实现。

【讨论】:

通过DiffUtil添加/删除单个项目时,如何处理更新现有项目位置的情况?

以上是关于DiffUtil 和 registerAdapterDataObserver的主要内容,如果未能解决你的问题,请参考以下文章

DiffUtil和它的差量算法

Android的Kotlin秘方(II):RecyclerView 和 DiffUtil

Android DiffUtil

如何使用 DiffUtil 更新 RecyclerView 适配器

DiffUtil 重绘 ListAdapter Kotlin 中的所有项目

带有 DiffUtil (ListAdapter) 的 RecyclerView 会阻塞 UI 线程