我有一个具有DiffUtil功能的RecyclerView适配器。
我想使用DataObserver在DiffUtil完成魔力时通知片段。但是,看起来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工作?我的(尝试使用react)方法有什么问题?

最佳答案

我发现了问题。我假设每次更改时都会调用onChanged()。但这是notify方法的 1:1

因此notifyDatasetChanged()会调用onChanged(),但DiffUtil永远不会调用它(这是DiffUtil的目的),这意味着必须实现所有其他方法(onItemRangeRemoved()onItemRangeMoved()等)。

10-04 17:15