美文网首页
Recyclerview关于ItemDecoration那些事

Recyclerview关于ItemDecoration那些事

作者: ana生 | 来源:发表于2017-09-13 14:45 被阅读0次

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


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

    实现效果:


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

    实现效果:

    image.png

    重写OnDrawOver方法

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

    相关文章

      网友评论

          本文标题:Recyclerview关于ItemDecoration那些事

          本文链接:https://www.haomeiwen.com/subject/yboksxtx.html