Recyclerview关于ItemDecoration那些事

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的界面


Recyclerview关于ItemDecoration那些事_第1张图片
image.png

重写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));

实现效果:


Recyclerview关于ItemDecoration那些事_第2张图片
image.png

重写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);
    }
}

实现效果:

Recyclerview关于ItemDecoration那些事_第3张图片
image.png

重写OnDrawOver方法

此方法和OnDraw方法大同小异,唯一的区别便是:OnDrawOver是在你的item上层绘制,例如:当你的item设置了background时,OnDraw方法绘制的内容会被item的background所遮盖,而OnDrawOver则不会。

你可能感兴趣的:(Recyclerview关于ItemDecoration那些事)