从头开始学 RecyclerView(五) ItemDecoration 详解

前言



RecyclerView.ItemDecoration,通过名字来看,它就是用来装饰Item的。

在类ListView的视图中,可能需要绘制分隔线;在类GridView的网格视图中,可能需要绘制单元格样式… 这些都可以由重写RecyclerView.ItemDecoration来进行定制。

然后调用mRecyclerView.addItemDecoration(itemDecoration); 即可

分析



看下RecyclerView.ItemDecoration的源码:

public static abstract class ItemDecoration {

    public void onDraw(Canvas c, RecyclerView parent, State state) {
        onDraw(c, parent);
    }

    public void onDrawOver(Canvas c, RecyclerView parent, State state) {
        onDrawOver(c, parent);
    }

    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
        getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
                parent);
    }
}

这里找的是,support-v7-25.3.1的RecyclView源码,去除了已过时的方法。

关于这三方法的作用:

  • onDraw

    它在item之前绘制,就像装饰了一个item的背景,在item之前绘制

  • onDrawOver

    它在item之后绘制,就像装饰了一个item的前景,在item之后绘制

  • getItemOffsets

    指定item间的偏移量。由指定outRect的left、top、right、bottom的像素值,来偏移item。指定了偏移量后,可能会影响item的宽或高。

这三个方法的执行顺序:getItemOffsets > onDraw > onDrawOver

ItemDecoration示例


DividerItemDecoration

DividerItemDecoration,在support-v7中已经集成了。全称 android.support.v7.widget.DividerItemDecoration

通过通的注释可知,它是用于在LinearLayoutManager所管理的item之间添加分隔线。

详细代码就不贴了。值得一提的是,它里面使用了一个系统属性来指定drawable资源:private static final int[] ATTRS = new int[]{ android.R.attr.listDivider };。 一般在ListView中我们就经常使用一个xml属性:android:divider。而这个属性对应的就是android:listDivider。

所以在styles.xml 中就可以定义这个属性:

<resources>
  <style ...>
    <item name="android:listDivider">@drawable/divider_hori</item>
  </style>
</resources>

效果图:

这条 蓝红绿颜色渐变的水平线,就是@drawable/divider_hori

GridDecoration

当使用GridLayoutManager时,想在每个item外绘制一个矩形框。

实现:重写RecyclerView.ItemDecoration的onDraw,绘制矩形框;重写getItemOffsets,指定item间偏移量。

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

    Paint paint = new Paint();
    paint.setColor(mBackColor);

    for (int i = 0, len = parent.getLayoutManager().getChildCount(); i < len; i++) {
        final View child = parent.getChildAt(i);

        int offset = 5;
        float left = child.getLeft() - offset;
        float top = child.getTop() - offset;
        float right = child.getRight() + offset;
        float bottom = child.getBottom() + offset;

        c.drawRect(left, top, right, bottom, paint);
    }
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
     outRect.offset(20, 30);

     int position = parent.getChildAdapterPosition(view);
     if (position % 2 == 1) {
         outRect.offsetTo(100, 20);
     }
 }

效果图:

示例详情见:https://github.com/aa86799/RecyclerView/tree/recycler-restart/

时间: 2024-10-11 13:48:44

从头开始学 RecyclerView(五) ItemDecoration 详解的相关文章

android RecyclerView (二) ItemDecoration 详解

RecyclerView 已经推出了一年多了,日常开发中也已经彻底从 ListView 迁移到了 RecyclerView,但前两天有人在一个安卓群里面问了个关于最顶上的 item view 加蒙层的问题,被人用 ItemDecoration 完美解决.此时我发现自己对 RecyclerView 的使用一直太过基本,更深入更强大的功能完全没有涉及,像 ItemDecoration, ItemAnimator, SmoothScroller, OnItemTouchListener, Layout

6.跟我学solr---请求参数详解

简介 前面我们在讲SolrRequestHandler和QueryResponseWriter的时候提到过两个参数'qt'和'wt",这两个参数是分别用于选择对应的SolrRequestHandler和QueryResponseWriter的.solr定义了很多类似的参数,它们都分别属于某个大类中,例如"qt"和"wt"就属于CoreQueryParameters.下面罗列一下solr的所有参数列表,来源于solr官网.下面笔者会一一给大家讲解这些参数的作

一起学python 三 --字符串详解,for循环

1.整型 n = 56 print(n.bit_length()) #查看值用几位(bit) # python2 中有长整型 long # python3 中全都是整型 2.bool True False print(boll(num)) #非0数字输出Ture 数字0输出False 所有空的都是False 0,None,[],{},(),"" print(int(True)) 1 print(int( False)) 0 ## 字符串转布尔值的时候,只要不为空就是Ture3.字符串详

青蛙学Linux&mdash;Nginx配置文件详解

Nginx的配置文件位于Nginx安装目录下的conf目录下,nginx.conf为其主要的配置文件,Nginx的主要功能都在该文件中进行配置. 1.main和event部分详解 我们先来看下nginx.conf中这一部分的内容: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid lo

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编写一些HTML代码,是很不方便的一件事情,每次都需要out.println(HTML); 因此就出现了JSP,来解决这样的问题,JSP中的内容就是html,但是能够嵌套java语言,现在来详细了解一下JSP. --WH 一.JSP 1.什么是JSP? JSP(Java Server Pages):是

从头开始学 RecyclerView(六) LayoutManager

前言 在前面的文章中,每个示例,都使用了LayoutManager,毕竟它是RecyclerView不可缺少的一部分. LayoutManager,顾名思义,就是『布局管理器』. 使用如下代码,设置RecyclerView的LayoutManager: mRecyclerView.setLayoutManager(layoutManager); 已提供的LayoutManager android.support.v7.widget.LinearLayoutManager android.supp

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 -- CardView.RecyclerView也是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓存. RecyclerView的优点就是,他可以通过设置LayoutMan

Docker 使用指南 (五)—— Dockerfile 详解

版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/97 来源:腾云阁 https://www.qcloud.com/community 制作Docker image 有两种方式:一是使用 Docker container,直接构建容器,再导出成 image 使用:二是使用 Dockerfile,将所有动作卸载文件中,再 build 成 image.Dockerfile 的方式非常灵活,推荐使用. 本次

从头开始学 RecyclerView(二) 添加item点击事件

不管了,先来张图 偶吐了个槽 item点击事件必须手动添加,默认并没有一个显式的API接口可供调用. 为了节约学习时间,网上找了篇很不错的文章.这里基本就复制了. 添加点击事件 RecyclerView#addOnItemTouchListener 分析 查看RecyclerView源码可以看到,RecyclerView预留了一个Item的触摸事件方法: public void addOnItemTouchListener(OnItemTouchListener listener) { mOnI