ItemDecoration直译“条目装饰品”,顾名思义,其主要用于给RecyclerView的每条item添加装饰,可以理解为分割线,但是决不仅限于分割线,实际上比分割线会的多。
RecyclerView没有提供divide属性,为RecyclerView添加分割线需要使用RecyclerView的addItemDecoration方法。这里主要写ItemDecoration的自定义方法。
RecyclerView有三个重写方法,分别是getItemOffsets,onDraw和onDrawOver。其中getItemOffsets主要用于在ItemView(Item的实际视图)四周撑开空间;onDraw主要用于在ItemView下方进行绘制;onDrawOver主要用于在ItemView上方进行绘制。
getItemOffsets(Rect outRect,View view,RecyclerView parent,RecyclerView.State state):此方法作用于每个ItemView,使用时直接分别用outRect.top=x、outRect.bottom=x、outRect.left=x、outRect.right=x在ItemView的上下左右方向撑出x像素的空间,效果类似于给每个Item的视图添加了padding值,视图向中间收缩。此方法直接对每个Item生效,参数中的view为当前Item的视图,只需处理特殊项,无需遍历。(如首项尾项可能分别不需要上分割线和下分割线,此时无需为他们撑开上下空间。需要注意的是被撑开的空间属于当前Item,并不是独立的视图)
onDraw(Canvas c,RecyclerView parent,RecyclerView.State state):此方法用于在Item视图的下层空间进行绘制,直接用Canvas进行绘制即可,注意这个方法中绘制的内容显示在Item的视图下层,因此可能被Item的视图遮挡住,所以一定要在getItemOffsets方法撑开的空白区域内进行绘制。这个方法的参数中并没有提供每个Item的视图,所以为每个Item绘制时要通过遍历拿到要绘制的Item的视图,根据视图的位置确定Decoration的绘制位置。
onDrawOver(Canvas c,RecyclerView parent,RecyclerView.State state):此方法用于在Item视图的上层空间进行绘制,使用方法和onDraw方法相同,不同的是由于此方法绘制的内容在显示在Item的视图上层,因此可能会遮挡Item的视图内容。所以使用时一定要把内容绘制在正确的位置上,不要遮挡了界面上的有效内容。