RecyclerView复用原理分析

http://www.jianshu.com/p/9306b365da57
首先要知道一些存放view的容器

    public final class Recycler {
        final ArrayList mAttachedScrap = new ArrayList<>();
        ArrayList mChangedScrap = null;

        final ArrayList mCachedViews = new ArrayList();

        private final List
                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;

mAttachedScrap: 用于缓存显示在屏幕上的 item 的 ViewHolder,场景好像是 RecyclerView 在 onLayout 时会先把 children 都移除掉,再重新添加进去,所以这个 List 应该是用在布局过程中临时存放 children 的,反正在 RecyclerView 滑动过程中不会在这里面来找复用的 ViewHolder 就是了。

mChangedScrap: 这个没理解是干嘛用的,看名字应该跟 ViewHolder 的数据发生变化时有关吧,在 RecyclerView 滑动的过程中,也没有发现到这里找复用的 ViewHolder,所以这个可以先暂时放一边。

mCachedViews:这个就重要得多了,滑动过程中的回收和复用都是先处理的这个 List,这个集合里存的 ViewHolder 的原本数据信息都在,所以可以直接添加到 RecyclerView 中显示,不需要再次重新 onBindViewHolder()。只有原来的卡位可以重新复用这个 ViewHolder,新位置的卡位无法从 mCachedViews 里拿 ViewHolder出来用。

mRecyclerPool:这个也很重要,但存在这里的 ViewHolder 的数据信息会被重置掉,相当于 ViewHolder 是一个重创新建的一样,所以需要重新调用 onBindViewHolder 来绑定数据。只要 ViewPool 里相同的 type 有 ViewHolder 缓存的话,就将最后一个拿出来复用,不用像 mCachedViews 需要各种匹配条件,只要有就可以复用。

mViewCacheExtension:这个是留给我们自己扩展的,好像也没怎么用,就暂时不分析了。
在上滑复用场景中

  • 首先寻找mCachedViews中的viewHolder
  • 匹配不到再从mRecyclerPool中拿出最后一个使用

你可能感兴趣的:(RecyclerView复用原理分析)