效果图:
ItemDecoration(翻译 Item装饰)
这玩意儿我一只以为只是用来绘制分割线的,没想到他的作用是:让item之间留出空隙,然后跟自定义View一样能随意的绘制想要的东西。
DividerItemDecoration(翻译 分割线 – item – 装饰)
系统提供了默认的 DividerItemDecoration
看看系统给的是怎么写的
getItemOffsets
设置哪块区域需要空出来,距离多少!!!
outRect.set(int left, int top, int right, int bottom)
这里就设置了,如果是VERTICAL,那就下面空出mDivider.getIntrinsicHeight()这点距离
空出来的距离,是独立的,不包含在item里
onDraw
绘制getItemOffsets空出来区域的自定义View效果
onDraw跟自定义的onDraw差不多。
绘制顺序是 onDraw —> 加载item —> onDrawOver()
所以onDrawOver里绘制的会覆盖 item 会覆盖 onDraw
也就是一般分割线这样的(随item可动的,在onDraw里)
不可动的View 在onDrawOver 里
如果是VERTICAL就绘制VERTICAL的
onDrawOver
跟onDraw一样,不过绘制出来的会覆盖,item
不可动的View 在onDrawOver 里绘制
MyItemDecoration — 自定义的
也是实现getItemOffsets、onDraw、onDrawOver
getItemOffsets
int position = parent.getChildAdapterPosition(view);
如果是头,那就空100dp(画tab View)不然就空1dp(画分割线)
onDraw
现在效果,还得画顶部长留的吸顶
onDrawOver
1.找到可见的第一个item,判断它是否是头部。
2.如果不是头,那就在顶部绘制一个这样的框
3.如果是头,那就底部可能被推上去一点。所以底边是
画出来的宽度 — 和 — 上一个view底部小一点那个
1.LinearLayoutManager.findFirstVisibleItemPosition() //可见区域的第一个item的position
2.View view = parent.findViewHolderForAdapterPosition(position).itemView; //取position位置的view
ViewHolder的itemView就是
3.boolean isGroupHead = adapter.isGourpHeader(position + 1 );//判断是否是头
完整代码