RecycleView添加分割线

Posted pszh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecycleView添加分割线相关的知识,希望对你有一定的参考价值。

首先我们要了解到的是  RecycleView添加的分割线有两种方式,

1.简单暴力的 ,直接在item的布局中添加分割线,

2.通过recycleView的内部方法addItemDecoration(class) ,这个class 集成下recyclerVIew.ItemDecoration这个类就可以了;

     recyclerVIew.ItemDecoration 那这个类具体有啥方法呢,我们来看下源码中两个主要的方法  画分割线的OnDraw()以及获取分割线宽度的getItemOffsets()方法。
public static abstract class ItemDecoration 
    /**
     * Draw any appropriate decorations into the Canvas supplied to the RecyclerView.
     * Any content drawn by this method will be drawn before the item views are drawn,
     * and will thus appear underneath the views.
     *
     * @param c Canvas to draw into
     * @param parent RecyclerView this ItemDecoration is drawing into
     * @param state The current state of RecyclerView
     */
    public void onDraw(Canvas c, RecyclerView parent, State state) 
        onDraw(c, parent);
    



    /**
     * @deprecated
     * Use @link #getItemOffsets(Rect, View, RecyclerView, State)
     *获取分割线的宽度
     */
    @Deprecated
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) 
        outRect.set(0, 0, 0, 0);
    


 
 
而我们的类也就需要继承这个类,实现这两个方法就好了, 

      首先实现个小目标,画一个简单的listview的分割线  这里我们首先要理解这个分割线就是一个距形,然后画一个距形也就是 canvas.drawRect(left,top,right,bottom,mPaint) ,所以我们的主要任务就是找到这个left. top. right.bottom 的值就好了,然后联系图看下这几个字段里面的距形就是我们要画的   
 
 
 
 

         理解了这几个字段后,我们就要去给这几个字段赋值了, 我们把红色框看成recyclerview  
 

       listView形式分割

        //横行的话,距离左右的距离是不变的, 上下的距离由每一个item的距离开始画的         final int left = recyclerview.getPaddingLeft();         final int right = recyclerview.getMeasuredWidth()-recyclerview.getPaddingRight();         //遍历每一个item         for (int i=0;i<recyclerview.getChildCount(); i++)             View child = parent.getChildAt(i);             RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();             int top = child.getBottom()+layoutParams.bottomMargin ;             int bottom = top+divigh_height;//顶部加高度就是底部了             c.drawRect(left,top,right,bottom,mPaint);         ok,就是这样了,就能画出一个listView类型的分割线了

同理的话 gridView的就是 

   final int top = parent.getPaddingTop();             final int bottom = parent.getMeasuredHeight()-parent.getPaddingBottom();             for(int i=0;i<parent.getChildCount();i++)                 View child = parent.getChildAt(i);                 RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();                 int left = child.getRight()+layoutParams.rightMargin;                 int right =left+divigh_height ;                 c.drawRect(left,top,right,bottom,mPaint);             ok,最后贴下这个类的代码吧,没有仔细的去封装了
public class RyDecoration extends RecyclerView.ItemDecoration 
    private Paint mPaint;
    private int oritation = LinearLayout.HORIZONTAL;
    private final int LINE_COLOR = 0xffff00ff;
    private int divigh_height = 10;

    public RyDecoration(Context context, int oritation) 
        this.oritation = oritation;
        if (oritation != LinearLayout.HORIZONTAL || oritation != LinearLayout.VERTICAL) 
            new IllegalAccessError("输入的参数不对");
        
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(LINE_COLOR);
        mPaint.setStyle(Paint.Style.FILL);
    

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) 
        super.onDraw(c, parent, state);
        if (oritation == LinearLayout.HORIZONTAL) 
            //横行的话,距离左右的距离是不变的, 上下的距离由每一个item的距离开始画的
            final int left = parent.getPaddingLeft();
            final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
            for (int i = 0; i < parent.getChildCount(); i++) 
                View child = parent.getChildAt(i);
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                int top = child.getBottom() + layoutParams.bottomMargin;
                int bottom = top + divigh_height;
                c.drawRect(left, top, right, bottom, mPaint);
            
         else 
            final int top = parent.getPaddingTop();
            final  int bottom = parent.getMeasuredHeight()-parent.getPaddingBottom();
            for(int i=0;i<parent.getChildCount();i++)
                View child = parent.getChildAt(i);
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                int left = child.getRight()+layoutParams.rightMargin;
                int right =left+divigh_height ;
                c.drawRect(left,top,right,bottom,mPaint);

            
        
    

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) 
        outRect.set(0, 0, 0, 0);
        super.getItemOffsets(outRect, view, parent, state);

    





使用,listView形式用 mRecyclerView.addItemDecoration(new RyDecoration(this,LinearLayout.HORIZONTAL)); gridview 形式用 mRecyclerView.addItemDecoration(new RyDecoration(this,LinearLayout.VERTICAL));

以上是关于RecycleView添加分割线的主要内容,如果未能解决你的问题,请参考以下文章

RecycleView添加分割线

RecycleView添加分割线

Recycleview模仿瑞幸咖啡菜单物品列表

ViewBinding与RecycleView(一)

RecycleView设置顶部分割线(记录一个坑)

1.Android recycleView万能分隔线 GridLayoutManager布局item左右间距均等(最易懂)