recyClerviewRecoreating视图持有人而不是重新介绍)。我发现的是,
RecyclerView
内部ItemAnimator
决定是否只需要反弹或应该创建和交叉一个新的视图持有人。
本文解释了一些事情:Https://medium.com/android-news/anatomy-of-recyclerview-part-part-part-1-a-search-for-a-viewholder-contine-d81c631a2b91
我假设这是决定应发生的事情的默认驱动器的一部分:
RecyclerView
告诉我问题的解决方案是只用一些任意的有效载荷来致电ViewHolder
/**
* {@inheritDoc}
* <p>
* If the payload list is not empty, DefaultItemAnimator returns <code>true</code>.
* When this is the case:
* <ul>
* <li>If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both
* ViewHolder arguments will be the same instance.
* </li>
* <li>
* If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)},
* then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and
* run a move animation instead.
* </li>
* </ul>
*/
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull List<Object> payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
}
现在,我想知道为什么以及何时会更好地重新创建整个
onItemRangeChanged()
并交叉crossfade,而不仅仅是更新它的特定部分?在上面提到的跨推荐问题中,我只是在改变了视图持有人的一小部分的可见性,但是重新创建了整个内容,我认为这是更差的表现吗?
记住
ViewHolder
可以具有多个项目视图类型。当导致视图类型更改时,无论有效载荷如何,视图持有人都没有资格进行重复使用。
在这种情况下,通过更换视图持有人的动画师保持统一的行为。
此外,通过更新视图持有人,他们将不会经历适配器
ViewHolder
人们在布置新项目时可能会期望哪些适配器,而notifyItemChanged
则被称为被删除的物品。如果您在随后的范围更新(无有效载荷)中遇到
onViewAttachedToWindow(holder)
电话,则应增加您的尺寸。
实际上,您可以避免重新读取。使用此代码:
onViewRecycled(holder)