android - DiffUtil 和 registerAdapterDataObserver

标签 android kotlin rx-java2 android-recyclerview reactive

我有一个具有 DiffUtil 功能的 RecyclerView 适配器。
我想在 DiffUtil 完成其魔法时使用 DataObserver 通知 fragment 。但是,看起来 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()每次发生变化时都会调用。但它是 1:1 notify方法。

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

关于android - DiffUtil 和 registerAdapterDataObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50371083/

相关文章:

android - 错误 : Error inflating class androidx. appcompat.widget.SearchView

Android ImageView 的可绘制色调不起作用

java - RxJava2 由于分支逻辑而丢失结果

android - 从 onContextItemSelected 显示的 DialogFragment 在暂停/恢复时不存在

android - 可以调用 Vibrator.vibrate() 的最短持续时间是多少,设备仍会振动?

android - 未捕获的翻译错误 : com. android.dx.cf.code.SimException: local 0007: invalid

kotlin - Kotlin flatMapTo无法编译

android-studio - 安卓工作室 : Adding a dependency that the IDE cannot download for itself

android - RxJava 2/Retrofit 2 - NetworkOnMainThreadException

rx-java - flatMapCompletable 不调用给定的 Action