Android Recyclerview添加项目,notifyiteminserted导致在绘制正确的视图之前闪烁回收视图

问题描述 投票:0回答:1

我有一个Recyclerview聊天记录,并做了一些改进以达到最佳性能。例如,当我将适配器设置为recyclerview时,我有:

listOfMessages.apply {
            adapter = chatMessageAdapter
            val linearLayoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true)
            linearLayoutManager.stackFromEnd = true
            setHasFixedSize(false)
            layoutManager = linearLayoutManager
            itemAnimator = null
            (listOfMessages.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, listOfMessages.bottom/2)
}

并且在适配器中,我用哈希设置了stableIds:conversationsAdapter?.setHasStableIds(true)并且在返回itemId时:messageList[position].hashCode().toLong()

并且当我向该recyclerview添加新项目时,我呼叫:

listOfMessages?.post {
    chatMessageAdapter?.let { adapter ->
        adapter.notifyItemInserted(0)
        (listOfMessages.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, listOfMessages.bottom/2)
}

该列表似乎表现不错,但是仍然有一个我找不到解决方案的问题:像Whatsapp或Instagram一样,当我添加一条消息时,视图绘制的速度过快,似乎该视图是先前绘制的,然后添加到列表中。但是以我为例,当我向聊天列表添加新消息时,添加的消息会闪烁并显示最后一个项目的文本(列表视图中“分离”的项目),然后该项目会自行更正,但是以“疯狂的视角闪烁”为代价。如何实现whatsapp或Instagram示例,添加后视图绘制正确,而不是先闪烁?我不知道这是回收视图问题还是什么问题。

android android-layout android-recyclerview recycler-adapter
1个回答
1
投票

为了防止新视图显示倒数第二个视图中的文本。覆盖onViewRecycled(VH holder)并使用右类型的所有者将textView的文本设置为空。为了防止新添加的视图闪烁,可以使用`recyclerView.setDefaultItemAnimator(null)禁用默认的项目动画器。

© www.soinside.com 2019 - 2024. All rights reserved.