专栏名称: saka
目录
相关文章推荐
51好读  ›  专栏  ›  saka

ItemDecoration的一些使用小技巧

saka  · 掘金  ·  · 2018-07-01 14:11

正文

阅读 19

ItemDecoration的一些使用小技巧

RecyclerView是安卓开发中常用的列表控件,当初google设计它的目的就是用来取代listview和gridview。这篇文章要讲的主角是recyclerview的一个附属品-ItemDecoration。讲解的也都是基础内容,主要有三个部分:

  1. 为每个item实现索引
  2. 为特定的item实现不同的分隔线
  3. 覆盖在item上的一个可移动的icon

最终的效果如下(忽略毫无设计的ui):

github地址: github.com/rangaofei/C…

简介

ItemDecoration是一个非常简单的抽象类,它没有抽象方法,除去废弃的api,共有三个方法可以重写,分别是

//获取当前view的位置信息
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)
//在item背后draw
public void onDraw(Canvas c, RecyclerView parent, State state)
//在item上边draw
public void onDrawOver(Canvas c, RecyclerView parent, State state)

这三个方法可以说是三个非常重要的方法,他们之间有着强烈的因果关系。

首先需要注意的是三个方法的调用顺序:

  1. 首先调用的是getItemOffsets会被多次调用,在layoutmanager每次测量可摆放的view的时候回调用一次,在当前状态下需要摆放多少个view这个方法就会回调多少次。
  2. 其次会调用ondraw方法,ItemDecoration的ondraw方法是在recyclerview的ondraw方法中调用的,注意这时候传入的canvas是recyclerview的canvas,要时刻注意这点,它是和recyclerview的边界是一致的。这个时候绘制的内容相当于背景,会被item覆盖。
  3. 最后调用的是ondrawover方法,ItemDecoration的ondrawover方法是在recyclerview的draw方法中调用的,同样传入的是recyclerview的canvas,这时候onlayout已经调用,所以此时绘制的内容会覆盖item。

理解了以上三个方法,我们就可以随意定制itemdecoration了。

为每个item实现索引

这个要引出的知识点是关于getItemOffsets的详细用法,在这里会传过来四个参数(所有的方法中的state暂不讨论,它和layoutmanager关系比较密切),主要关注前三个参数:

  1. outRect,核心参数,这个rect相当于item摆放的时候设置的margin,rect的left相当于item的marginleft,rect的right相当于item的marginright。
  2. view,当前绘制的view,可以用来获取它在adapter中的位置
  3. parent,recyclerview,没什么好说的。

上一段简单的代码,来实现为所有的左侧添加一个空白

if (parent.getLayoutManager() instanceof LinearLayoutManager) {
    this.layoutOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();
}
switch (this.layoutOrientation) {
    case LinearLayoutManager.VERTICAL:
        outRect.set(40, 0, 0, 2);//bottom正常






请到「今天看啥」查看全文


推荐文章
遇见漫画  ·  《我的女友是老司机》第18-19话
8 年前
二更食堂  ·  最令人讨厌的三个聊天回复
8 年前
读万卷书聚正能量  ·  做清澈的人,简单善良
7 年前