Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android DiffUtil和registerAdapterDataObserver_Android_Kotlin_Rx Java2_Android Recyclerview_Reactive - Fatal编程技术网

Android DiffUtil和registerAdapterDataObserver

Android DiffUtil和registerAdapterDataObserver,android,kotlin,rx-java2,android-recyclerview,reactive,Android,Kotlin,Rx Java2,Android Recyclerview,Reactive,我有一个具有DiffUtil功能的RecyclerView适配器。 我想使用DataObserver在DiffUtil完成其魔术时通知fragment。但是,DiffUtil似乎没有调用观察者 适配器 private val items: MutableList<Message> private val updater = PublishSubject.create<MutableList<Message>>() init { items = Arr

我有一个具有DiffUtil功能的RecyclerView适配器。 我想使用DataObserver在DiffUtil完成其魔术时通知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)
}

如何使AdapterDataObserver工作?我的(尝试被动)方法有什么问题?

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


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

当通过
DiffUtil
添加/删除单个项目时,您如何处理更新现有项目位置的情况?
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
    override fun onChanged() {
        //is not called
    }
})