介绍

作为一个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. Android题目笔记(二)
  2. android 九宫格 移动 并且删除 带动画效果
  3. Android加载大图和Lrucache 避免oom
  4. zip解压缩的使用
  5. android LruCache设置缓存的使用
  6. PullDownListView高仿微信下拉眼睛出现动画
  7. 2011.09.14(2)——— android tabhost位于底部
  8. Android自定义动画框架让View实现Path动画
  9. Android(安卓)Scroll

随机推荐

  1. Android开发笔记(五十九)巧用传感器
  2. Android下的配置管理之道之repo的使用
  3. android连接打印机打印
  4. Android上的MSN初见成效~~!!
  5. Android (安卓数据的五种存储方式)
  6. Android向Fragment传值
  7. Android 如何开发指纹支付
  8. Android(安卓)LayoutInflater原理分析,带
  9. Android(安卓)Day03-SQLite数据库操作及L
  10. UI更新及消息处理机制