notifyItemRangeChanged(positionStart, itemCount)
产生的情况:从 position 在[positionStart + 5, positionStart + itemCount)范围内,都需要重新创建ViewHolder。
无法避免。
原因:由于每次RecyclerView的ItemAnimator执行完成后都会将此次发生动画的Item加入到RecycldViewrPool中(最大Item容量:默认为5);而我们可以获取到的缓存position范围是[positionStart + itemCount,最大position],即未发生改变且可视的Item,所以
ViewHolder tryGetViewHolderForPositionByDeadline(int position,
boolean dryRun, long deadlineNs) {
ViewHolder holder = null;
holder = getScrapOrHiddenOrCachedHolderForPosition(position, dryRun);//获取缓存中的数据,即未发生改变且可视的Item
1.
//当position范围在[positionStart,positionStart + 5)时holder==null
//但可以在RecycldViewrPool中获取到一个空ViewHolder并重新Bind
2.
//当position范围在[positionStart + 5, positionStart + itemCount)时holder==null
//RecycldViewrPool最大为5,已获取完毕,无法再次取到空ViewHolder利用
//重新创建,重新bind
3.
//当position范围是[positionStart + itemCount,最大position]holder!=null
//可以通过上面的getScrapOrHiddenOrCachedHolderForPosition获取到
}