【发布时间】:2021-05-29 13:28:42
【问题描述】:
嘿,所以基本上我最近遇到了RecyclerView 的问题(这里描述了我遇到的问题:RecyclerView recreating ViewHolder instead of rebinding)。我发现,RecyclerView 中的 ItemAnimator 决定了更改后的 ViewHolder 是否只需重新绑定或创建新的 ViewHolder 并进行淡入淡出。
这篇文章解释了一些事情: https://medium.com/android-news/anatomy-of-recyclerview-part-1-a-search-for-a-viewholder-continued-d81c631a2b91
我假设这是 DefaultItemAnimator 的一部分,它决定应该发生什么:
/**
* {@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(),它总是会重用ViewHolder。
我的问题:
现在我想知道为什么以及何时重新创建整个ViewHolder 并淡入淡出它比仅仅更新它的特定部分更好?在上面提到的交叉引用问题中,我只是更改了 ViewHolder 的一小部分的可见性,但整个事情都被重新创建了,我认为这在性能方面会更差吗?
【问题讨论】:
标签: android android-recyclerview android-viewholder