IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> RecyclerView使用GridLayoutManager时如何等分间距 -> 正文阅读

[移动开发]RecyclerView使用GridLayoutManager时如何等分间距

最近在做需求的时候,需要在界面展示一个四列的列表。毫无疑问,我们应该采用RecyclerView并采用它的网格布局管理器,即GridLayoutManager来实现。当然,这种实现肯定是没问题的。不过设计老师一般会要求让这几列的列表把给出的宽度等距离分割掉。也就是说,第一列和最后一列的列表不能距两边有间距,之间的需要等分间距。类似这样的效果

那么假如我们把宽度设置为wrap_content,则出来的效果距离右边还有相当距离,无法让最后一列内容紧贴右侧。假如我们将宽度设置为match_parent,再给每个item右边设置间距亦或是将宽度写死,再添加margin,均无法得到预期的效果。

但是将宽度设置为match_parent是可以做到将每个Item均分,即便它们之间没有间距。这也是我们实现等间距的前提。

添加间距和RecyclerView的ItemDecoration有关,其中有一个方法getItemOffsets。这个方法获取给定ItemView的偏移量,用outRect 表示。outRect的每个字段分别表示不同方向的偏移量,类似于填充或边距。默认设置为0,即没有间距。

因此重写这个方法即为我们实现等间距的核心,实现的思路如下

左侧的间距+右侧的间距为设置的间距,在视觉上达到等分的效果。需要满足两个条件

  1. 各个Item的大小相等,即各列的left+right 值相等
  2. 各列的间距相等,即前列的right + 后列的left = 列间距

得出公式

某列的左间距 =? 所在列 * (列间距?* (列数)/ 1)

某列的右间距 = 列间距 - 后列的左间距 = 列间距 - (所在列 + 1)* (列间距?* (列数)/ 1)

所在列从0开始

下面看代码实现

class GridSpaceItemDecoration(
    private val spaceCount: Int,
    private val rowSpace: Float,
    private val columnSpacing: Float
) : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        val position = parent.getChildAdapterPosition(view) // 获取view 在adapter中的位置。

        val column = position % spaceCount // view 所在的列


        outRect.left = (column * columnSpacing / spaceCount).toInt() // column * (列间距 * (1f / 列数))

        outRect.right =
            (columnSpacing - (column + 1) * columnSpacing / spaceCount).toInt() // 列间距 - (column + 1) * (列间距 * (1f /列数))

        // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=rowSpace
        if (position >= spaceCount) {
            outRect.top = rowSpace.toInt() // item top
        }
    }
}

使用方法为

   binding.paperContentView.addItemDecoration(
                GridSpaceItemDecoration(
                    4,
                    0F,
                    DisplayUtil.dp2px(requireContext(), 25F)
                )
            )

其中DisplayUtil是dp转px的工具类,大家按自己的需求传入列间距和行间距就可以了。

文章原创来自RecyclerView GridLayoutManager 等分间距 - 掘金

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:02:21  更:2022-03-21 21:04:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:11:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码