前几天学到关于官方推荐的RecycleView的间隔分割线通过addItemDecoration()实现。
我之前item分割线的方法就是通过设置Item背景图来实现分割线。现在尝试一下官方推荐的方法。AS 3.2 + android 9.0 测试
关于recycleView的适配器还有recycle的设置这里就不贴了。加下划线部分为我个人理解内容,如有错误请指正。
首先要自定义MyItemDecoration继承RecyclerView.ItemDecoration
onDraw、onDrawOver、getItemOffsets三个方法
三个方法在调用的时候顺序如下,getItemOffsets设置item偏移量,ondraw(Over)绘制分割线样式(onDraw和onDrawOver区别在于在item绘制前/后被调用,好像用哪个没什么影响)
设置item之间的间隔
如果只想设置item之间的间隔,只需要重新getItemOffsets,通过outRect.set(left,top,right,bottom)设置间隔,类似于layout_margin的作用。(getItemOffsets设置的偏移只对item layout页面产生影响,不对定义的分割线产生影响)
网上说addItemDecoration()的优势在于不需要加载大量的资源(下划线的背景图片),那么我觉得对于只需要正间隔的item来说我觉得还是设置margin方便一些,如果想要有叠加的效果什么的还是应该要靠getItemOffsets的。
设置自定义分割线
绘制分割线的话需要先定义好Drawable 和属性集合int[] ,在构造函数中通过obtaimStyledAttributes(int[])获取分割线属性并获取资源赋值给Drawable。这里构造函数中的orientation我没有用到,如有需要的自行调用判断就好。
R.attr.listDivider应该等同于listView的android:divider="" 分割线属性
obtaimStyledAttributes(attr) 获取相应属性组
TypedArray.getDrawable() 获取属性对应的资源Drawable。getDrawable(int index) 中index是数组的索引,从0开始。我尝试getDrawable(1)时就报了NotFoundException异常,应该是只有一个属性吧。
绘制下划线在onDraw中进行
主要核心是divider.setBounds(left,top,right,bottom);divider.draw(c);
这里的left right指向的就是下划线的水平方向的起点和重点位置(原点为左上角,不知道这里是以Canvas坐标为准还是View还是其他的为准)
top bottom 通过debug发现也是以坐标计算。譬如第一个的top=112,bottom=115,第二个top=174,bottom=177,第二个top=236,bottom=239......