作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有 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
}
})
最佳答案
我发现了问题。我假设 onChanged()
每次发生变化时都会调用。但它是 1:1 与 notify
方法。
所以notifyDatasetChanged()
调用 onChanged()
,但 DiffUtil 从来不调用它(这就是 DiffUtil 的目的),这意味着所有其他方法(onItemRangeRemoved()
、onItemRangeMoved()
等)都必须实现。
关于android - DiffUtil 和 registerAdapterDataObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50371083/
我有一个具有 DiffUtil 功能的 RecyclerView 适配器。 我想在 DiffUtil 完成其魔法时使用 DataObserver 通知 fragment 。但是,看起来 DiffUti
我是一名优秀的程序员,十分优秀!