介绍
作为一个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库。包括功能如下: