Recyclerview缓存机制分析

本文深入探讨了RecyclerView的缓存机制,从四个级别的缓存——mAttachedScrap、mCachedViews、mViewCacheExtension和mRecyclerPool进行分析。重点讨论了如何根据位置和类型复用ViewHolder,以及在滑动过程中的缓存策略。通过一个实例验证了在滑动过程中ViewHolder的创建和复用情况。
摘要由CSDN通过智能技术生成

最近做项目的时候突然想到一个问题,就是在项目里面使用了多种ViewHolder,但是在onBindView这个方法中,RecyclerView是如何知道我在哪个位置需要的是哪种ViewHolder呢?就这个问题趁机看了一下源码,终于找到了答案,原来RecyclerView的缓存机制是区分type的,也就是Recyclerview.Adapter.getItemViewType()这个方法的返回值来区分的。
那么从哪里开始看RecyclerView的源码呢?
因为View创建出来需要加到RecyclerView中,所以从view的measure、layout中去找,RecyclerView的布局都是交给LayoutManager,这里以LinearLayoutManager为例,从onLayoutChildren开始,调用链为

onLayoutChildren --> fill --> layoutChunk

这里fill、layoutChunk都是布局的核心代码,在layoutChunk开头有这么一段:

 View view = layoutState.next(recycler);

这个地方返回一个view,传进去的参数为recycler,大概可以猜到这和缓存有关了,点进去看看:

View next(RecyclerView.Recycler recycler) {
            if (mScrapList != null) {
                return nextViewFromScrapList();
            }
            final View view = recycler.getViewForPosition(mCurrentPosition);
            mCurrentPosition += mItemDirection;
            return view;
        }

果然,使用到了recycler.getViewForPosition,这个就是缓存的其实方法,最终看到了tryGetViewHolderForPositionByDeadline这个方法,这里就是缓存逻辑的核心代码,这里只挑重点看:

ViewHolder tryGetViewHolderForPositionByDeadline(int position,
                boolean dryRun, long deadlineNs) {
             .......
             //和动画有关系,而且scrapList是在LayoutManager内部的,和recyclerview关系不大
            if (mState.isPreLayout()) {
                holder = getChangedScrapViewForPosition(position);
                fromScrapOrHiddenOrCache = holder != null;
            }
     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值