RecyclerView notifyItemRangeChanged(positionStart, itemCount)

104 阅读1分钟

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获取到
                
                
}