当前位置: 移动技术网 > IT编程>移动开发>Android > Android 给RecyclerView添加分割线的具体步骤(分享)

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

陈佩斯朱时茂小品,i5 3210,植物大战宠物小精灵

【吐槽】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添加分割线的具体步骤(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网