美文网首页
RecyclerView滑动回收复用机制简析

RecyclerView滑动回收复用机制简析

作者: link的勇气 | 来源:发表于2018-10-25 11:16 被阅读0次

    Recycler
    作为RecyclerView的内部类,Recycler负责管理废弃或分离的项目视图以供重用。

    以下摘自Recycler源码

            final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
            ArrayList<ViewHolder> mChangedScrap = null;
    
            final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
    
            private final List<ViewHolder>
                    mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);
    
            private int mRequestedCacheMax = DEFAULT_CACHE_SIZE;
            int mViewCacheMax = DEFAULT_CACHE_SIZE;
    
            RecycledViewPool mRecyclerPool;
    
            private ViewCacheExtension mViewCacheExtension;
    
            static final int DEFAULT_CACHE_SIZE = 2;
    
    

    复用
    在滑动RecyclerView的过程中,当有新的item将要展示出来时,会先根据position从Recycler中的mCachedViews中取,如果获取不到,则再到mRecyclerPool中取。
    因为是根据item位置获取的,从mCachedViews取出的viewholder还保持着数据,取到可直接显示。从mRecyclerPool取到的,会调用 resetInternal() 来重置 ViewHolder,所以会重新调用onBindViewHolder()来绑定数据。

    回收
    随着滑动完全滑出屏幕的item会被回收viewholder
    当前被回收的ViewHolder会放入mCachedViews,mCacheViews的最大缓存大小由mViewCacheMax控制,默认值是2,当mCacheViews缓存数量已达最大值,会将第一个ViewHolder移动到mRecyclerPool中,再将需要缓存的ViewHolder加入到mCacheViews尾部。
    RecyclerPool中的ViewHolder是根据viewType分类缓存的,默认每种最多存5个。

    总结
    RecyclerView 滑动场景下的回收复用涉及到的结构体两个:
    ArrayList<ViewHolder> mCachedViews

    RecycledViewPool mRecyclerPool

    mCachedViews 优先级高于 mRecyclerPool,回收时,最新的 ViewHolder 都是往 mCachedViews 里放,如果它满了,那就移出一个扔到 mRecyclerPool里好空出位置来缓存最新的 ViewHolder。

    复用时,也是先到 mCachedViews 里找 ViewHolder,但需要各种匹配条件,概括一下就是只有原来位置的卡位可以复用存在 mCachedViews 里的 ViewHolder,如果 mCachedViews 里没有,那么才去 mRecyclerPool里找。

    在 mRecyclerPool里的 ViewHolder 都是跟全新的 ViewHolder 一样,只要 type 一样,有找到,就可以拿出来复用,重新绑定下数据即可。

    如果既没有从mCacheViews中找到匹配position的,也没有从mRecyclerPool中找到viewType一致的ViewHolder,就只能调用 Adapter 的 onCreateViewHolder 来创建一个新的 ViewHolder 使用了。

    相关文章

      网友评论

          本文标题:RecyclerView滑动回收复用机制简析

          本文链接:https://www.haomeiwen.com/subject/jalqtqtx.html