【发布时间】:2021-05-20 17:59:33
【问题描述】:
基本上我有一个带有聊天消息的RecyclerView。场景如下:
- 我添加了一条消息 -> 导致
RecyclerView添加新的ViewHolder - 延迟约 2 秒
- 我更改了第一条消息并添加了一条新消息 -> 应该导致
RecyclerView重新绑定第一条消息并为第二条消息创建一个新的ViewHolder。
我的问题在于第 3 步。因为第一个 ViewHolder 被删除并创建一个新的 ViewHolder 然后绑定。这会产生非常轻微的闪烁,这有点烦人,总而言之,这不应该发生。
我正在使用DiffUtil 来调度更改,整个设置涉及更多一些,因此很难描述整个情况,但我将其缩小为:
DiffUtil 产生正确的结果,并为第一项调用onItemRangeChanged,为第二项调用onItemRangeInserted。无论出于何种原因,第一个 ViewHolder 都会被移除,并创建、添加和绑定新的 on。
是否有人经历过类似的行为或知道为什么会出现这种情况?我试图通过RecyclerView 代码进行调试,但这是一场噩梦,我仍然不明白整个事情。第一个ViewHolder不能被反弹而必须创建一个新的可能是什么原因?
如果我可以提供更多信息,请询问,我会尽力而为。
可以在此处找到显示问题的小型存储库:https://github.com/MaxGierlachowski/recyclerview_viewholder_bug
如果您查看错误日志并查看第 4 个“MESSAGE”日志,您会看到一个 onChanged 和一个 onInserted 被分派到适配器,但是为 onChanged 一个创建了一个新的 ViewHolder。我知道 RecyclerView 会检查很多东西,比如动画完成等等,但我真的很想知道为什么 ViewHolder 没有反弹而是重新创建。
编辑:
我发现如果createViewHolder 被RecyclerView 调用,则应该重用的ViewHolder 位于mChangedScrap 列表中,而mState.isPreLayout() 为false,因此函数tryGetViewHolderForPositionByDeadline() 不会搜索@987654341 @list 并创建一个新的。但这不应该发生,ViewHolder 甚至没有动画或其他东西,似乎所有动画都在那时完成了。
【问题讨论】:
标签: android android-recyclerview android-viewholder