【吐槽】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,State state) { onDrawOver(c,parent); } public voID getItemOffsets(Rect outRect,VIEw vIEw,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.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,RecyclerVIEw.State state) { super.getItemOffsets(outRect,vIEw,state); outRect.set(0,mdivIDer.getIntrinsicHeight(),mdivIDer.getIntrinsicHeight()); } }
2、为RecyclerVIEw添加写好的Itemdecoration即可
mRecyclerVIEw.addItemdecoration(new divIDerItemdecoration(this));
3、没有3。
其实从 RecyclerVIEw.Itemdecoration 的名字就看得出来,它是RecyclerVIEw的item的装饰品,也就是说,除了画分割线,想画什么都是可以的。
以上这篇AndroID 给RecyclerVIEw添加分割线的具体步骤(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android 给RecyclerView添加分割线的具体步骤(分享)全部内容,希望文章能够帮你解决Android 给RecyclerView添加分割线的具体步骤(分享)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)