Android 给RecyclerView添加分割线的具体步骤(分享)
【吐槽】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添加分割线的具体步骤(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: 從博客網扣了一個效果出來
下一篇: PHP操作Memcache实例介绍