RecyclerView,DiffUtil和奇怪的动画

时间:2018-06-12 13:35:41

标签: android animation android-recyclerview rx-java2 recycler-adapter

我有一个使用websockets的聊天应用程序。 通过websocket我收到消息,我将其保存到对话表中的db,messages表和更新last message id。现在,两个保存都将通知光标。所以我打电话给updateDate两次。它们将以正确的顺序和正确的线程顺序运行。然而,我猜,动画是重叠的,并且在youtube video attached中可以看到奇怪的效果(从消息" i"中可见)。任何人都可以查明我的问题或给我解决方案吗?

我使用rxjava进行线程化和出列以进行堆叠更新,同时始终只从dequeue获取最后一次更新。来自vlc的灵感here

RecyclerView从末端堆叠,如果用户滚动到底部,则在新消息到来时运行动画滚动到底部。

片段

adapter = ChatMessageAdapter()
recycler.apply {
    adapter = this@ChatDetailFragment.adapter
    layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false).apply { stackFromEnd = true }
}

ChatMessageAdapter

private val pendingUpdates: ArrayDeque<Single<Pair<MutableList<ChatItemHolder>, DiffUtil.DiffResult>>> = ArrayDeque()

@MainThread
fun updateData(msgs: MutableList<ChatMessage>, onDone: () -> Unit) {
    pendingUpdates.add(
        internalUpdate(msgs)
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSuccess {
                items.clear()
                items.addAll(it.first)
                it.second.dispatchUpdatesTo(this@ChatMessageAdapter)
                onDone()
            }
    )
    if (pendingUpdates.size == 1) pendingUpdates.peek().subscribe(Consumer {processQueue()})
}

private fun internalUpdate(msgs: MutableList<ChatMessage>) = Single.create<Pair<MutableList<ChatItemHolder>, DiffUtil.DiffResult>> {
    val newItems = temp(msgs) // transforming function from ChatMessage[] to ChatItemHolder[]
    val result = DiffUtil.calculateDiff(DiffUtilCallback(newItems, items), true)
    it.onSuccess(Pair(newItems, result))
}

@MainThread
private fun processQueue() {
    pendingUpdates.remove()
    if (!pendingUpdates.isEmpty()) {
        if (pendingUpdates.size > 1) {
            val last = pendingUpdates.peekLast()
            pendingUpdates.clear()
            pendingUpdates.add(last)
        }
        pendingUpdates.peek().subscribe(Consumer { processQueue() })
    }
}

谢谢!

0 个答案:

没有答案