RecyclerView源码分析一之简单介绍

介绍

作为一个Android开发者,肯定对RecyclerView并不陌生。它相对ListView来说,有很多的优势,尤其是在使用方面。

  • Adapter
  • LayoutManager
  • Recycler
  • ItemAnimator
  • ItemDecoration
Adapter

Adapter实现数据和RecyclerView中的ItemView的关联工作

LayoutManager

LayoutManager负责在Recyclerview内部测量、定位items,并且决定何时回收用户不可见View的。通过不同LayoutManager能够实现不同的滚动效果。

Reycler

Recycler负责管理无用的Item(Scraped和Detached),进行再次复用。Scraped表示依然attach在RecyclerView但是被标记为removal或者reuse的item。
LayoutManager通常使用Recycler根据给定位置或者ItemId处的数据,来获取一个ItemView。如果要被复用的Views认为是dirty,将要求adapter重新进行数据绑定。否则 LLM会迅速完成复用而不需要其他额外工作。没有调用isLayoutRequested()的clean Item仅仅需要LayoutManager重新定位。

public final class Recycler {
		
		//1,一级缓存
        final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
        ArrayList<ViewHolder> mChangedScrap = null;
        //2. 二级缓存
        final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();    
        //3,三级缓存
        private ViewCacheExtension mViewCacheExtension;  
        //4. 四级缓存
        RecycledViewPool mRecyclerPool;
       
}
ItemAnimator

该类定义了当Adapter中发生变化时,在Items上需要执行的动画。当自定义动画时,在实现动画的方法中,当动画执行完成一定要调用dispatchAnimationFinished() 通知动画执行完成。

ItemDecoration

ItemDecoration运行应用程序添加一些额外的绘制和位置偏移,更加Aadapter中的数据集。这对在Item之间添加分割线、高亮、边界是非常有效的。ItemDecoration的绘制在onDraw在itemViews绘制之前,onDrawOver在最后。

 public abstract static class ItemDecoration {
        /**
         * 该方法在Item绘制之前被调用
         * @param c Canvas to draw into
         * @param parent RecyclerView this ItemDecoration is drawing into
         * @param state The current state of RecyclerView
         */
        public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {
            onDraw(c, parent);
        }

        /**
         * 该方法在Item绘制之后被调用
         * @param c Canvas to draw into
         * @param parent RecyclerView this ItemDecoration is drawing into
         * @param state The current state of RecyclerView.
         */
        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
                @NonNull State state) {
            onDrawOver(c, parent);
        }

      

        /**
         * item偏移位置信息,如果不想影响item的位置,则设置为0
         * 
         * @param outRect Rect to receive the output.
         * @param view    The child view to decorate
         * @param parent  RecyclerView this ItemDecoration is decorating
         * @param state   The current state of RecyclerView.
         */
        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
                                   @NonNull RecyclerView parent, @NonNull State state) {
            getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
                    parent);
        }
		 public void getItemOffsets(@NonNull Rect outRect, int itemPosition,
		                @NonNull RecyclerView parent) {
		            outRect.set(0, 0, 0, 0);
		        }

    }
简单使用
//rcl 是RecyclerView的一个实例
//1. 设置一个动画(可选项)
rcl.itemAnimator = FlipInLeftYAnimator().apply{
    setInterpolator(OvershootInterpolator())
     addDuration = 1000
     removeDuration = 1000
     moveDuration = 1000
     changeDuration = 1000
 }
//2. 设置layoutManager(必需项)
rcl.layoutManager = LinearLayoutManager(this)
//3. 设置适配(必需项)
rcl.adapter = SimpleAdapter(tmp)
优秀的封装库

BRVAH ,本人认为这是迄今为止,封装的最优秀的RecyclerView库。包括功能如下:
RecyclerView源码分析一之简单介绍_第1张图片

下一篇RecyclerView源码分析二之绘制与复用

你可能感兴趣的:(Android,原理)