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源码分析二之绘制与复用
更多相关文章
- Android题目笔记(二)
- android 九宫格 移动 并且删除 带动画效果
- Android加载大图和Lrucache 避免oom
- zip解压缩的使用
- android LruCache设置缓存的使用
- PullDownListView高仿微信下拉眼睛出现动画
- 2011.09.14(2)——— android tabhost位于底部
- Android自定义动画框架让View实现Path动画
- Android(安卓)Scroll