自定义RecyclerView的ItemDecoration实现吸顶效果

效果图:

994249DAA03F1FD83C0DC78034122FFB.gif

ItemDecoration(翻译 Item装饰)

这玩意儿我一只以为只是用来绘制分割线的,没想到他的作用是:让item之间留出空隙,然后跟自定义View一样能随意的绘制想要的东西。

image.png

DividerItemDecoration(翻译 分割线 – item – 装饰)

系统提供了默认的 DividerItemDecoration

image.png

看看系统给的是怎么写的

getItemOffsets

设置哪块区域需要空出来,距离多少!!!

outRect.set(int left, int top, int right, int bottom)

这里就设置了,如果是VERTICAL,那就下面空出mDivider.getIntrinsicHeight()这点距离

image.png

空出来的距离,是独立的,不包含在item里
image.png

onDraw

绘制getItemOffsets空出来区域的自定义View效果

onDraw跟自定义的onDraw差不多。
绘制顺序是 onDraw —> 加载item —> onDrawOver()
所以onDrawOver里绘制的会覆盖 item 会覆盖 onDraw

也就是一般分割线这样的(随item可动的,在onDraw里)
不可动的View 在onDrawOver 里

如果是VERTICAL就绘制VERTICAL的
image.png

image.png

onDrawOver

跟onDraw一样,不过绘制出来的会覆盖,item

不可动的View 在onDrawOver 里绘制

MyItemDecoration — 自定义的

也是实现getItemOffsets、onDraw、onDrawOver

getItemOffsets

int position = parent.getChildAdapterPosition(view);
如果是头,那就空100dp(画tab View)不然就空1dp(画分割线)

image.png

onDraw

image.png

现在效果,还得画顶部长留的吸顶

44BF1B1280F31CD899B70156753E4E67.jpg

onDrawOver

1.找到可见的第一个item,判断它是否是头部。
2.如果不是头,那就在顶部绘制一个这样的框
image.png

3.如果是头,那就底部可能被推上去一点。所以底边是
画出来的宽度 — 和 — 上一个view底部小一点那个

image.png

1.LinearLayoutManager.findFirstVisibleItemPosition() //可见区域的第一个item的position

2.View view = parent.findViewHolderForAdapterPosition(position).itemView; //取position位置的view ViewHolder的itemView就是
image.png

3.boolean isGroupHead = adapter.isGourpHeader(position + 1 );//判断是否是头

image.png

完整代码

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享