欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 给RecyclerView添加分割线的具体步骤(分享)

程序员文章站 2023-11-13 12:53:10
【吐槽】recyclerview没有提供分割线的方法,想要加个线还要自己画,点击事件的监听都要自己实现,不过真的好用。 给recyclerview添加分割线的步骤 1、...

【吐槽】recyclerview没有提供分割线的方法,想要加个线还要自己画,点击事件的监听都要自己实现,不过真的好用。

给recyclerview添加分割线的步骤

1、新建类继承于recyclerview.itemdecoration,此为是抽象类:

  public static abstract class itemdecoration {

  public void ondraw(canvas c, recyclerview parent, state state) {
    ondraw(c, parent);
  }

  public void ondrawover(canvas c, recyclerview parent, state state) {
    ondrawover(c, parent);
  }

  public void getitemoffsets(rect outrect, view view, recyclerview parent, state state) {
    getitemoffsets(outrect, ((layoutparams) view.getlayoutparams()).getviewlayoutposition(),
        parent);
  }

}

“ondraw和ondrawover,显然,这两个方法是用于绘制的,那么绘制分割线的逻辑可以放在这里面,它们二者的具体区别是:ondraw是在item view绘制之前调用,而ondrawover是在item view绘制之后调用,因此我们一般选择重写其中一个方法即可。getitemoffsets,这个方法是告诉recyclerview在绘制完一个item view的时候,应该留下多少空位,以便于绘制分割线。”

好像逻辑也不难,但是真的好麻烦,比如我要给我的瀑布流布局加一条系统自带的分割线,系统自带的就行,那我要新建一个实现类:

public class divideritemdecoration extends recyclerview.itemdecoration {
    //使用系统自带的listdivider
    private static final int[] attrs = new int[]{
        android.r.attr.listdivider
    };

    private drawable mdivider;

    public divideritemdecoration(context context) {
      super();
      // 从typedarray中得到一个drawable对象
      final typedarray typedarray = context.obtainstyledattributes(attrs);
      mdivider = typedarray.getdrawable(0);

      typedarray.recycle();
    }

    @override
    public void ondraw(canvas c, recyclerview parent, recyclerview.state state) {
      super.ondraw(c, parent, state);
      drawdivider(c, parent);
    }

    /**
     * 遍历childview,为每一个childview描绘divider
     * @param c 画布对象
     * @param parent 父控件即recyclerview
     */
    private void drawdivider(canvas c, recyclerview parent) {
      //获取分割线的上边距,即recyclerview的padding值
      final int top = parent.getpaddingtop();

      //分割线下边距
      final int bottom = parent.getheight() - parent.getpaddingbottom();

      final int childcount = parent.getchildcount();

      //遍历所有item view,为它们的右边方绘制分割线,就是计算出上下左右四个值画一个矩形
      for (int i = 0; i < childcount; i++) {
        final view child = parent.getchildat(i);
        final recyclerview.layoutparams params = (recyclerview.layoutparams) child.getlayoutparams();
        final int left = child.getright() + params.rightmargin;
        final int right = left + mdivider.getintrinsicwidth();
        //画右边的divider
        mdivider.setbounds(left, top, right, bottom);
        mdivider.draw(c);

        //画完右边画底边
        mdivider.setbounds(child.getleft() + child.getpaddingleft(), child.getbottom() + params.bottommargin,
            child.getright() - child.getpaddingright(), child.getbottom() + mdivider.getintrinsicheight());
        mdivider.draw(c);
      }
    }

    @override
    public void getitemoffsets(rect outrect, view view, recyclerview parent, recyclerview.state state) {
      super.getitemoffsets(outrect, view, parent, state);
      outrect.set(0, 0, mdivider.getintrinsicheight(), mdivider.getintrinsicheight());
    }
  }

2、为recyclerview添加写好的itemdecoration即可

mrecyclerview.additemdecoration(new divideritemdecoration(this));

3、没有3。

其实从 recyclerview.itemdecoration 的名字就看得出来,它是recyclerview的item的装饰品,也就是说,除了画分割线,想画什么都是可以的。

以上这篇android 给recyclerview添加分割线的具体步骤(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。