一、何为ItemDecoration
在RecyclerView中,ItemDecoration被用于分隔RecyclerView的Item,它能够为RecyclerView的每个Item提供一个背景或者空隙。它是一个abstract基类,需要通过继承的方式来自定义。它能够对ItemView的绘制进行拦截,并且自己绘制一些需要的内容,从而实现分隔线、空白格等效果。
二、实现ItemDecoration
在RecyclerView中添加ItemDecoration需要以下步骤:
1. 创建一个继承自ItemDecoration的类,重写onDraw() 和 getItemOffsets()方法。
2. 在RecyclerView中setAdapter()方法之后,通过addItemDecoration()方法来设置ItemDecoration。
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public MyItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.left = space;
outRect.right = space;
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = space;
} else {
outRect.top = 0;
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
int paddingLeft = parent.getPaddingLeft();
int paddingRight = parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + space;
c.drawRect(paddingLeft, top, parent.getWidth() - paddingRight, bottom, paint);
}
}
}
三、实现效果
如下代码所示,如果需要为RecyclerView设置ItemDecoration,可以通过addItemDecoration()方法来实现,需要传入一个ItemDecoration的对象。下面以添加分隔线为例:
RecyclerView mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
MyItemDecoration myItemDecoration = new MyItemDecoration(10);
mRecyclerView.addItemDecoration(myItemDecoration);
运行效果如下图所示:

四、总结
通过ItemDecoration,我们可以对RecyclerView进行更丰富的定制和装饰,可以为RecyclerView的每个Item添加分隔线、背景等效果。该特性不仅能够优化交互体验,同时可以为RecyclerView添加更多的个性化元素,从而让用户更好地享受使用体验。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/279451.html