RecyclerView回收原理分析

2017-11-30  本文已影响0人  吕志豪

http://blog.csdn.net/boboyuwu/article/details/77148302
首先分析的入口

removeAndRecycleView

        /**
         * Remove a child view and recycle it using the given Recycler.
         *
         * @param child Child to remove and recycle
         * @param recycler Recycler to use to recycle child
         */
        public void removeAndRecycleView(View child, Recycler recycler) {
            removeView(child);
            recycler.recycleView(child);
        }

recycler.recycleView(child);

        public void recycleView(View view) {
            ......
            recycleViewHolderInternal(holder);
        }

recycleViewHolderInternal mViewCacheMax=2

        void recycleViewHolderInternal(ViewHolder holder) {
                    ......
                    int cachedViewSize = mCachedViews.size();
                    if (cachedViewSize >= mViewCacheMax && cachedViewSize > 0) {
                        recycleCachedViewAt(0);
                        cachedViewSize--;
                    }
                    ......
        }

recycleCachedViewAt

        void recycleCachedViewAt(int cachedViewIndex) {
            ......
            addViewHolderToRecycledViewPool(viewHolder, true);
            mCachedViews.remove(cachedViewIndex);
        }

addViewHolderToRecycledViewPool

        void addViewHolderToRecycledViewPool(ViewHolder holder, boolean dispatchRecycled) {
            ......
            getRecycledViewPool().putRecycledView(holder);
        }

putRecycledView mMaxScrap=5

        public void putRecycledView(ViewHolder scrap) {
            final int viewType = scrap.getItemViewType();
            final ArrayList<ViewHolder> scrapHeap = getScrapDataForType(viewType).mScrapHeap;
            if (mScrap.get(viewType).mMaxScrap <= scrapHeap.size()) {
                return;
            }
           ......
            scrapHeap.add(scrap);
        }

以上为recyclerview对滑出的子view进行的大致操作

关注点:

  1. 容器有两种
        static class ScrapData {
            ArrayList<ViewHolder> mScrapHeap = new ArrayList<>();
            int mMaxScrap = DEFAULT_MAX_SCRAP;//5
            long mCreateRunningAverageNs = 0;
            long mBindRunningAverageNs = 0;
        }
        SparseArray<ScrapData> mScrap = new SparseArray<>();

2 .移除的view流程,首先进入mCachedViews,

上一篇 下一篇

猜你喜欢

热点阅读