RecycleView深入理解系列之ItemDecoration

来源:互联网 发布:剑雨江湖灵骑进阶数据 编辑:程序博客网 时间:2024/06/10 04:53

首先我们要理解ItemDecoration是什么?它能干什么呢?

我们在使用RecycleView的时候会发现,它不像ListView一样有divider可以给每个Item设置分割线,那么它是怎么实现分割线呢?通常情况下,我们比较快捷简单的方法就是给每个Item的布局设置margin来实现它。但是我们可以通过下面的方法添加分割线: 

mRecyclerView.addItemDecoration()                     

RecycleView.ItemDecoration

RecycleView.ItemDecoration为抽象类,它有三个主要的方法:

  • onDraw(Canvas c, RecyclerView parent, State state)
  • onDrawOver(Canvas c, RecyclerView parent, State state)
  • getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)
这里说下我对这三个方法的个人理解,首先我们要知道这三个方法执行先后顺序,通过查看其他的博客和自己打印日志发现:
getItemOffsets最先执行且执行次数和屏幕可见的Item次数一样;之后是onDraw(执行了一次);最后是onDrawOver(也是一次)
知道了三个方法的执行顺序后我们结合他们各自的功能就能更好的理解ItemDecoration。

这边博客对这三个方法我感觉讲解挺不错的,我下面的就是摘自这边博客的,有时间可以更好的看看这边博客。
Po的RecycleView深入理解之ItemDecoration

getItemOffsets:

每一个子view在设置itemDecoration的时候都会进入这个回调,可以通过设置第一个参数Rect,为子view增加padding值,例如outRect.set(10,20,30,40),即为子view左边距增加10,上边距增加20,右边距增加30,下边距增加40。 
为什么要增加边距? 
是否增加边距可以由开发者自己决定。 
如果绘制的装饰内容是在item的上下左右空白处,则为item增加边距再绘制装饰才不会遮盖住item原本显示的内容。 
如果绘制的装饰内容是直接遮盖在item上面的,例如为item绘制半透明遮罩,这种情况则不需要为item增加边距。

个人对这个方法的理解:简单说你要绘制多大多高多宽的装饰线,就要在这里设置多大的偏移量,不然你绘制的就会覆盖在下一个Item上。

onDraw 以及 onDrawOver:

关于这两个方法的原理,这里不会太具体的解释,只需要记住: decoration 的 onDraw,child view 的 onDraw,decoration 的 onDrawOver,这三者是依次发生的

也就是说,onDraw绘制的内容会在子item的下面,onDrawOver绘制的内容会在子item的上面,至于装饰内容要放在下面被子item覆盖,还是要放在上面覆盖子item由具体场景决定。

个人对这两个方法的理解:对这两个方法的理解,最好根据层和执行顺序来理解。

onDraw先执行也就是先绘制,所以Item就在它上面绘制着,如果getItemOffsets没有设置好,Item就会覆盖它,你就看不到效果。

反之onDrawOver就不用考虑这个了,就只用考虑每个ItemDecoration的rect就行了。

理解了这三个方法,其他的就是根据需求来搭建自己的逻辑代码了,这里我就不一一描述了。度娘上有一大堆ItemDecoration的效果。

推荐几篇关于ItemDecoration的个人感觉还不错的博客。

Piasy 的RecycleView深入理解之ItemDecoration

自定义ItemDecoration

ItemDecoration详解

ItemDecoration由浅及深