欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

RecyclerView的ItemDecoration

程序员文章站 2022-06-22 19:05:27
RecyclerView怎么添加分割线?系统帮我们提供了ItemDecoration抽象类,继承该抽象类重写相应的方法即可。ItemDecoration 抽象类该类很简单,除去3个已经废弃的方法,只有三个方法,如下:我们来看以下这三个方法的作用:getItemOffset /** * @param outRect Rect to receive the output. * @param view The child view to decorate * @param pare...

RecyclerView怎么添加分割线?
系统帮我们提供了ItemDecoration抽象类,继承该抽象类重写相应的方法即可。

ItemDecoration 抽象类

该类很简单,除去3个已经废弃的方法,只有三个方法,如下:
RecyclerView的ItemDecoration
我们来看以下这三个方法的作用:

getItemOffset
 /**
  * @param outRect Rect to receive the output.
  * @param view    The child view to decorate
  * @param parent  RecyclerView this ItemDecoration is decorating
  * @param state   The current state of RecyclerView.
  */
 public void getItemOffsets(
 	@NonNull Rect outRect, 
	@NonNull View view,
    @NonNull RecyclerView parent, 
    @NonNull State state) { }

getItemOffset:从名字可以看出,获取item的偏移量,结果保存在第一个参数outRect中(Rect类型是一个矩形,可以设置上,下,左,右四个值,正好对应一个view在四个方向上的偏移量)。

比如我想在每个item的上方空出2个像素的距离,可以这样写:

四个参数依次表示:left,top,right,bottom
outRect.set(0, 2, 0, 0)
onDraw
/**
  * @param c Canvas to draw into
  * @param parent RecyclerView this ItemDecoration is drawing into
  * @param state The current state of RecyclerView
  */
   public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {}

绘制方法,可以在此方法中绘制你想要的各种效果,这个方法是在绘制itemView之前调用,所以绘制的东西会显示在ItemView的底部。如果有重叠,会被ItemView遮挡。如下图:
绿色区域(重叠部分)被itemView覆盖
RecyclerView的ItemDecoration

onDrawOver
 /**
  * @param c Canvas to draw into
  * @param parent RecyclerView this ItemDecoration is drawing into
  * @param state The current state of RecyclerView.
  */
 public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
         @NonNull State state) { }

与onDraw相反,此方法在绘制ItemView之后调用,所以绘制的内容在ItemView上层,如果有重叠区域,会覆盖掉ItemView的内容。如下图:
RecyclerView的ItemDecoration

总结

以上方法的调用顺序:
getItemOffset --> onDraw --> 绘制Item --> onDrawOver

官方自己的实现类DividerItemDecoration

Google为我们提供了一个ItemDecoration实现类——DividerItemDecoration(给我们打了个样