我有一个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示例,添加后视图绘制正确,而不是先闪烁?我不知道这是回收视图问题还是什么问题。
为了防止新视图显示倒数第二个视图中的文本。覆盖onViewRecycled(VH holder)
并使用右类型的所有者将textView的文本设置为空。为了防止新添加的视图闪烁,可以使用`recyclerView.setDefaultItemAnimator(null)禁用默认的项目动画器。