Android DiffUtil和registerAdapterDataObserver
我有一个具有DiffUtil功能的RecyclerView适配器。 我想使用DataObserver在DiffUtil完成其魔术时通知fragment。但是,DiffUtil似乎没有调用观察者 适配器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
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
}
})