iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >RecyclerView设置间距和添加分割线的方法
  • 735
分享到

RecyclerView设置间距和添加分割线的方法

2024-04-02 19:04:59 735人浏览 安东尼
摘要

使用RecyclerView布局,经常需要调整间距和添加分割线以达到更美观的效果,虽然一直接触和使用,但却从来没有认真研究过,经常忘记如何使用,现在就来好好研究一番 先放上一个没有分

使用RecyclerView布局,经常需要调整间距和添加分割线以达到更美观的效果,虽然一直接触和使用,但却从来没有认真研究过,经常忘记如何使用,现在就来好好研究一番

先放上一个没有分割线的效果图

添加默认的分割线

使用RecyclerView.addItemDecoration(ItemDecoration decor)方法,添加默认的分割线
最简单的方式就是,添加一个简单的DividerItemDecoration类:

//添加默认的分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

得到的效果图

另外,可以使用DividerItemDecoration.setDrawble()传入一个Drawable对象来定义我们想要的效果
绘制一个高度为2dp,颜色为绿色的矩形并将它传入

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="Http://schemas.android.com/apk/res/android">

    <solid android:color="#00ff00"/>

    <size android:height="2dp" />

</shape>
//添加默认分割线
DividerItemDecoration decoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration.setDrawable(getResources().getDrawable(R.drawable.divider_green));
recyclerView.addItemDecoration(decoration);

得到的效果图

然后,我发现RecyclerView添加分割线还有一个重载方法:

RecyclerView.addItemDecoration(ItemDecoration decor, int index)

想也没想,还以为是在指定的位置添加分割线,随便打了个数字测试,结果程序闪退了
开源码一看,原来内部用了一个数组存储添加进来的ItemDecoration,怪不得方法名是addItemDecoration()而不是setItemDecoration(),也就是说RecyclerView可以添加多个ItemDecoration,那么就来试试吧:
绘制了三个矩形,颜色分别为绿色、红色和蓝色,高度分别为4dp、8dp和12dp,将它们都传入

//添加默认分割线
DividerItemDecoration decoration1 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration1.setDrawable(getResources().getDrawable(R.drawable.divider_green));
DividerItemDecoration decoration2 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration2.setDrawable(getResources().getDrawable(R.drawable.divider_red));
DividerItemDecoration decoration3 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration3.setDrawable(getResources().getDrawable(R.drawable.divider_blue));
recyclerView.addItemDecoration(decoration1);
recyclerView.addItemDecoration(decoration2);
recyclerView.addItemDecoration(decoration3);

效果图:

换个顺序传入

recyclerView.addItemDecoration(decoration3);
recyclerView.addItemDecoration(decoration2);
recyclerView.addItemDecoration(decoration1);

效果图:

很显然,绘制顺序是以内部数组中的存储顺序为基准的,并且间距是由所有传入的ItemDecoration的高度或宽度共同计算得到的(所以会出现除了三种颜色外的灰色分割线)

添加自定义分割线

默认的分割线效果不好,想要自定义分割线该怎么做?
很简单,我们只需要自定义一个类去继承ItemDecoration类,并重写相关的方法就可以了。添加默认分割线时使用的DividerItemDecoration也是如此。
编写一个MyDecoration类,继承RecyclerView.ItemDecoration类,Ctrl+O,发现除去已弃用的方法和构造方法,ItemDecoration类主要有三个方法:

public void onDraw(canvas c, RecyclerView parent, State state)
public void onDrawOver(Canvas c, RecyclerView parent, State state)
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)

大概描述一下几个方法的作用:

  • getItemOffsets(),获取Item的偏移量,调整参数中outRect的相关值,可以实现类似padding的效果。
  • onDraw(),用这种方法绘制的任何内容都将在绘制项目视图之前绘制,绘图的内容将出现在视图下方。
  • onDrawOver(),用这种方法绘制的任何内容都将在绘制项目视图之后绘制,绘图的内容会出现在视图上方。

百闻不如一见,直接看实际效果

getItemOffsets()方法:

//添加自定义分割线
class MyDecoration extends RecyclerView.ItemDecoration {

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //设置间距
        outRect.bottom = 10;
    }
}
//添加装饰
recyclerView.addItemDecoration(new MyDecoration());

这里仅设置了底部间距,实现的效果类似之前使用的DividerItemDecoration

再给每个方向上都设置间距,看看效果

//添加自定义分割线
class MyDecoration extends RecyclerView.ItemDecoration {

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //设置间距
        outRect.left = 30;
        outRect.right = 50;
        outRect.top = 15;
        outRect.bottom = 10;
    }
}
//添加装饰
recyclerView.addItemDecoration(new MyDecoration());

可以看到,实现了类似padding的效果

onDraw()方法:

//添加自定义分割线
class MyDecoration extends RecyclerView.ItemDecoration {

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //设置间距
        outRect.bottom = 10;
    }
    
    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        //获取item的数量
        int count = parent.getChildCount();
        //设置要绘制的矩形的left、right、top、bottom值
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        for (int i = 0; i < count; i++){
            //获取对应的item
            View view = parent.getChildAt(i);
            float top = view.getBottom();
            float bottom = view.getBottom() + 10;
            //绘制矩形
            c.drawRect(left,top,right,bottom,paint);
        }
    }
}
recyclerView.addItemDecoration(new MyDecoration());

这里仍仅设置底部间距,并在onDraw()方法中实例化一个paint对象,设置颜色为蓝色,用于最终的绘制。之后获取item的数量,通过一个循环来绘制每一个item下方的分割线(当然也可以通过某些条件判断,以达到只绘制部分分割线的效果),这个分割线的顶部恰好是item的底部,分割线的底部则是item的底部+间距,所以有:

float top = view.getBottom();
float bottom = view.getBottom() + 10;
//绘制矩形
c.drawRect(left,top,right,bottom,paint);

实际效果图:

onDrawOver()方法:

直接在刚才的基础上,重写onDrawOver()方法

@Override
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
    super.onDrawOver(c, parent, state);
    Paint paint = new Paint();
    paint.setColor(Color.RED);

    int count = parent.getChildCount();
    float left = parent.getRight() - 40;
    float right = parent.getRight();
    for (int i = 0; i < count; i++){
        View view = parent.getChildAt(i);
        float top = view.getTop();
        //会覆盖掉部分蓝色分割线
        float bottom = view.getBottom() + 5;
        c.drawRect(left,top,right,bottom,paint);
    }
}

之前说过,onDraw()方法绘图的内容将出现在视图下方,而onDrawOver()方法的绘图内容会出现在视图上方,因此这里的红色分割线会略微覆盖掉一部分之前的蓝色分割线

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: RecyclerView设置间距和添加分割线的方法

本文链接: https://www.lsjlt.com/news/166829.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • RecyclerView设置间距和添加分割线的方法
    使用RecyclerView布局,经常需要调整间距和添加分割线以达到更美观的效果,虽然一直接触和使用,但却从来没有认真研究过,经常忘记如何使用,现在就来好好研究一番 先放上一个没有分...
    99+
    2024-04-02
  • Android 给RecyclerView添加分割线的具体步骤(分享)
    【吐槽】RecyclerView没有提供分割线的方法,想要加个线还要自己画,点击事件的监听都要自己实现,不过真的好用。给RecyclerView添加分割线的步骤1、新建类继承于RecyclerView.ItemDecoration,此为是抽...
    99+
    2023-05-31
    recyclerview 分割线 android
  • CSS设置行间距和字间距的方法
    这篇文章主要介绍“CSS设置行间距和字间距的方法”,在日常操作中,相信很多人在CSS设置行间距和字间距的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS设置行间距和字间距的方法”的疑惑有所帮助!接下来...
    99+
    2023-06-14
  • css字间距的设置方法
    这篇文章给大家分享的是有关css字间距的设置方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样式,使网页更加美化。它也...
    99+
    2023-06-14
  • 【Android】RecyclerView实现列表中的Item之间设置间距的一种方式
    前言 RecyclerView 的 Item 默认没有间距是因为 RecyclerView 是一个高度自定义的控件,它的目标是提供一个高效灵活的列表展示,并且适应各种不同的布局需求。 为了让开发者能够充分自定义列表项的布局和样式,Recyc...
    99+
    2023-08-16
    android
  • html设置文字间距的方法
    这篇文章主要讲解了“html设置文字间距的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“html设置文字间距的方法”吧!html设置文字的间距的方法是,...
    99+
    2024-04-02
  • html表格设置间距的方法
    小编给大家分享一下html表格设置间距的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html表格设置间距的方法:1、设置第一个tbale的【margin-b...
    99+
    2023-06-06
  • css设置表格间距的方法
    小编给大家分享一下css设置表格间距的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!css设置表格间距的方法:1、使用padding属性对table的td元素...
    99+
    2023-06-14
  • css字符间距的设置方法
    这篇文章主要介绍css字符间距的设置方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在css中,字符间距可以使用letter-spacing属性来设置,语法格式“letter-spacing:间距值;”。lette...
    99+
    2023-06-14
  • css段落间距的设置方法
    小编给大家分享一下css段落间距的设置方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主...
    99+
    2023-06-14
  • css上下间距的设置方法
    这篇文章主要介绍了css上下间距的设置方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。css设置上下间距的方法:1、使用“line-height:间距值;”样式来设置上下间...
    99+
    2023-06-08
  • html设置表格间距的方法
    这篇文章主要介绍html设置表格间距的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在html中,可以使用border-spacing属性来设置表格间距,该属性设置相邻单元格的边框间的距离(仅用于“边框分离”模式...
    99+
    2023-06-15
  • css文字行间距设置的方法
    今天小编给大家分享一下css文字行间距设置的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
  • 在html中设置文字间距的方法
    这篇文章将为大家详细讲解有关在html中设置文字间距的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在html中,可以使用letter-spacing属性设置文字间距,该属性可以增加或减少字符间的空白...
    99+
    2023-06-06
  • css设置行间距的三种方法是什么
    本篇内容主要讲解“css设置行间距的三种方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css设置行间距的三种方法是什么”吧!1、使用数值来设置行间距<!DOCTYPE ...
    99+
    2023-06-30
  • Mysql添加用户和设置权限的操作方法
    目录一、管理用户二、权限控制DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 一、管理用户 用户相关命令: 查询...
    99+
    2024-04-02
  • Android为TextView添加字体库和设置描边的方法
    一、使用系统自带的字体开发Android的人大多都知道,Android里面对字体的支持少得可怜,默认情况下,TextView 的 typeface 属性支持 sans、serif和monospace 这三种字体,如果在没有指定字体的情况下,...
    99+
    2023-05-30
    android 字体库 库和
  • 添加phpmyadmin设置界面登录用户名和密码的方法
    小编给大家分享一下添加phpmyadmin设置界面登录用户名和密码的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在搭建好mysql和php环境以后,输入 http://localhost...
    99+
    2024-04-02
  • html中div间距CSS样式布局设置的方法有哪些
    这篇文章主要介绍“html中div间距CSS样式布局设置的方法有哪些”,在日常操作中,相信很多人在html中div间距CSS样式布局设置的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • 阿里云服务器添加信任设备的设置方法
    在阿里云服务器上添加信任设备是一项重要的安全措施,可以有效防止恶意攻击和数据泄露。本篇文章将详细介绍如何在阿里云服务器上添加信任设备。 阿里云服务器是一款强大的云计算产品,提供了丰富的服务和功能。其中,添加信任设备是一项重要的安全措施,可以...
    99+
    2023-12-14
    阿里 服务器 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作