RecyclerView没有像之前ListView提供divider属性,而是提供了方法
recyclerView.addItemDecoration()
其中ItemDecoration需要我们自己去定制重写,一开始可能有人会觉得麻烦不好用,最后你会发现这种可插拔设计不仅好用,而且功能强大。
ItemDecoration类主要是三个方法:
//可以实现类似绘制背景的效果,内容在上面
public void onDraw(Canvas c, RecyclerView parent, State state)
//可以绘制在内容的上面,覆盖内容
public void onDrawOver(Canvas c, RecyclerView parent, State state)
//可以实现类似padding的效果
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)
下面来具体看下效果如何:
我们没有添加任何ItemDecoration的界面
重写getItemOffsets方法
public class SimplePaddingDecoration extends RecyclerView.ItemDecoration {
private int dividerHeight;
public SimplePaddingDecoration(Context context) {
dividerHeight = context.getResources().getDimensionPixelSize(R.dimen.divider_height);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.bottom = dividerHeight;//类似加了一个bottom padding
}
}
没错,就这么2行代码,然后添加到RecyclerView
recyclerView.addItemDecoration(new SimplePaddingDecoration(this));
实现效果:
重写OnDraw方法
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
//先初始化一个Paint来简单指定一下Canvas的颜色,就黑的吧!
Paint paint = new Paint();
paint.setStrokeWidth(size);
paint.setColor(ContextCompat.getColor(parent.getContext(), line_color));
//获得RecyclerView中总条目数量
int childCount = parent.getChildCount();
//遍历一下
for (int i = 0; i < childCount; i++) {
if (i == 0 || i == childCount || i == childCount - 1) {
//如果是第一个条目,那么我们就不画边框了
continue;
}
//获得子View,也就是一个条目的View,准备给他画上边框
View childView = parent.getChildAt(i);
//先获得子View的长宽,以及在屏幕上的位置,方便我们得到边框的具体坐标
float x = childView.getX();
float y = childView.getY();
int width = childView.getWidth();
int height = childView.getHeight();
c.drawLine(x + margin, y, x + width - margin, y, paint);
super.onDrawOver(c, parent, state);
}
}
实现效果:
重写OnDrawOver方法
此方法和OnDraw方法大同小异,唯一的区别便是:OnDrawOver是在你的item上层绘制,例如:当你的item设置了background时,OnDraw方法绘制的内容会被item的background所遮盖,而OnDrawOver则不会。