Android Recyclerview间距 均分 完美布局 支持任意列数和两端间距

Android实现空间不够,自动换行 阅读详情

最近项目中要在RecyclerView的Grid中均分间距,看了源码和一些文章,下面的这篇很有启发,在此引用一下,并且在他的基础上支持任意列数和两端间距。最后附上代码:

原文链接:https://blog.youkuaiyun.com/lovext4098477/article/details/80419201

简介:

  App中,用到最多的设计就是列表形式的布局,而RecyclerView的出现,也完完全全的替代了之前的Listview、GridView,成为android控件中,用途最为广泛的widget之一,今天就来简单介绍一下,RecyclerView的一些布局方法。

实战:

  我们经常在设计稿中看到各式各样的列表,最通常的需求,就是对各个item进行排列,这就运用到了对分割线的处理。在RecyclerView中,有一个public void addItemDecoration(RecyclerView.ItemDecoration decor)的方法,RecyclerView.ItemDecoration这个类里包含了一个getItemOffsets的方法,我们就是要通过这个方法去对每个item分割,通过设置不同的offset来改变间距。以下图这个相册的为例:

 

  让我们来简单地剖析一下布局,假设屏幕是720px,每个间距为20px,通过计算,每个item的长宽为165px。

  这时候,很多人会考虑这样去设置

  我这里是dp转px,720是2x,所以delta是10px,通过parent.getChildAdapterPosition(view)来判断是每一行的第几个,然后第一个item设置了左0右10,第二个左10右10,第三个10右10,第四个左10右0。嗯,理论上来看好像是这样的,动手试试。结果发现,这样的布局并没有到达上图设计的效果。这是为什么呢?

  首先,我们要了解RecyclerView的分割原理,当一个RecyclerView设置了一个GridLayoutManager(this,count),并且count为4的时候,实际上就是将屏幕均分为四份,每一份都是180px宽(以720px为例,我们只考虑左右,暂不考虑上下,原理是相同的),如果不设置ItemDecoration,那么默认item由左开始布置,也就是说,165px的View在它的布局中是这样婶儿的。

  显而易见,无论我如何设置,item距边界最多就15px(left+right),如果要保证第一个item和第二个item间距为20px,那么我只需要将第二个item设置一个left为5px就可以达到想要的效果。第三第四个也同理。

  所以正确的左右设置应该为

 

在此基础上进行改进,支持任意列数和两端间距:

核心代码:

RecyclerView.LayoutManager rvLayoutManager = parent.getLayoutManager();

        if (rvLayoutManager == null || parent.getAdapter() == null) {
            return;
        }
        if (gapHSizePx < 0 || gapVSizePx < 0) {

            DisplayMetrics displayMetrics = new DisplayMetrics();
            parent.getDisplay().getMetrics(displayMetrics);
            gapHSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, gapHorizontalDp, displayMetrics);
            gapVSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, gapVerticalDp, displayMetrics);
            edgePaddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, edgePaddingDp, displayMetrics);

            if (rvLayoutManager instanceof GridLayoutManager) {
                GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
                spanCount = layoutManager.getSpanCount();
                eachItemPaddingH = (edgePaddingPx * 2 + gapHSizePx * (spanCount - 1)) / spanCount;
            } else if (rvLayoutManager instanceof StaggeredGridLayoutManager) {
                StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) parent.getLayoutManager();
                spanCount = layoutManager.getSpanCount();
                eachItemPaddingH = (gapHSizePx * (spanCount - 1)) / spanCount;
                //特殊设置
                int rvPadding = 0;
                if (layoutManager.getOrientation() == StaggeredGridLayoutManager.VERTICAL) {
                    rvPadding = edgePaddingPx - gapHSizePx / 2;
                } else {
                    rvPadding = edgePaddingPx - gapVSizePx / 2;
                }
                rvPadding = rvPadding >= 0 ? rvPadding : 0;
                parent.setPadding(rvPadding, 0, rvPadding, 0);
            } else if (rvLayoutManager instanceof LinearLayoutManager) {
                spanCount = 1;
                eachItemPaddingH = (edgePaddingPx * 2 + gapHSizePx * (spanCount - 1)) / spanCount;
            } else {
                throw new RuntimeException("不支持的LayoutManager");
            }
        }

        int position = parent.getChildAdapterPosition(view);
        if (!handleDecorationAtAdapterPosition(outRect, view, parent, state, position)) {
            if (rvLayoutManager instanceof GridLayoutManager) {
                setGridDecoration(outRect, view, parent, state, position);
            } else if (rvLayoutManager instanceof StaggeredGridLayoutManager) {
                setStaggeredGridDecoration((StaggeredGridLayoutManager) rvLayoutManager, outRect, view, parent, state, position);
            } else if (rvLayoutManager instanceof LinearLayoutManager) {
                spanCount = 1;
                setLinearDecoration((LinearLayoutManager) rvLayoutManager, outRect, view, parent, state, position);
            } else {
                throw new RuntimeException("不支持的LayoutManager");
            }
        }
        if (BuildConfig.DEBUG) {
            Log.d("ItemDecoration", "pos=" + position + "," + outRect.toShortString());
        }

下载地址:GridAverageGapItemDecoration

另外如果项目中用到了Brvah,并且想自定义Section中的间距的话,看这篇:

BRVAH的Section中自定义间距,条目完美均分,支持Section顶部和底部间距

Android RecyclerView使用GridLayoutManager间距设置的方法 阅读详情

相关推荐

Android RecyclerView用法 视频列表 两列

Android RecyclerView滑动列表 ,可横向 纵向布局 。视频播放滑动列表 2列

Android自动换行的流式布局

我们在开发过程中经常会遇到列表item宽度不定的情况,当显示不下时需要自动换行,常见的例子如一些热门话题标签、搜索热词等展示,今天我们就梳理出几种常用自动换行的流式布局来解决。

Over_dose的博客 4552

论文地图合规求生指南:5分钟搞定标准地图服务转ArcGIS可用矢量文件

本文提供了一份论文地图合规求生指南,帮助非GIS专业背景的科研人员在5分钟内将标准地图服务的EPS文件转换为ArcGIS兼容的矢量文件。通过详细的工作流程和关键参数设置,确保地图完全符合国家规范,同时节省时间成本。重点关注标准地图服务的合规性和Shapefile转换技巧,适用于紧急情况下的论文地图处理。

weixin_34233974的博客 402

RecyclerView addItemDecoration 的妙用 - item 间距平均分布和添加分割线

前言 RecyclerView,在开发当中使用非常频繁的一个控件,今天,主要讲解以下两个问题 添加分割线 item 间距的平均分布 addItemDecoration 方法简介 我们先来看一下 addItemDecoration 方法 [官网链接](https://developer.android.com/reference/android/support/v7/widget/Recycl...

徐公,微信公众号同名 2万+

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 919

登临科技Goldwasser加速卡Python SDK实战:从环境配置到YOLOv5模型性能压测

本文详细介绍了登临科技Goldwasser加速卡的Python SDK实战指南,从环境配置到YOLOv5模型性能压测的全过程。通过驱动安装、SDK环境搭建、模型转换与推理优化等步骤,帮助开发者高效利用AI加速卡提升深度学习模型性能。重点分享了批量推理压测技巧和常见问题解决方案,助力开发者充分发挥Goldwasser加速卡的算力优势。

weixin_29035147的博客 301

android 均匀布局,Android Recyclerview间距 均分 完美布局 支持任意列数和两端间距-Go语言中文社区...

最近项目中要在RecyclerView的Grid中均分间距,看了源码和一些文章,下面的这篇很有启发,在此引用一下,并且在他的基础上支持任意列数和两端间距。最后附上代码:简介:App中,用到最多的设计就是列表形式的布局,而RecyclerView的出现,也完完全全的替代了之前的Listview、GridView,成为android控件中,用途最为广泛的widget之一,今天就来简单介绍一下,Recy...

weixin_29082143的博客 1045

阿里云Ubuntu部署Steam饥荒联机版服务器:从零到多人联机的完整指南

本文详细介绍了在阿里云Ubuntu系统上部署Steam饥荒联机版服务器的完整流程,包括环境准备、SteamCMD安装、服务端配置、Mod管理及后台运行技巧。通过2核4GB的ECS实例配置和端口设置,实现5人流畅联机体验,适合游戏爱好者快速搭建专属服务器。

weixin_29229261的博客 1025

android布局平均,Android recyclerview 支持网格布局的间隙平均分割

GridSpacingItemDecorationpublic class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {private int spanCount;private int spacing;private boolean includeEdge;public GridSpacingItemDecorat...

weixin_35513543的博客 663

语言 拉丁超立方抽样_医学统计与R语言:间断时间序列分析(Interrupted time series regression)...

微信公众号:医学统计与R语言如果你觉得对你有帮助,欢迎转发Interrupted time series (ITS) analysis is a valuable study design for evaluating the effectiveness of population-level health interventions that have been implemented...

weixin_29300805的博客 3706

Qt C++ 电子海图与作战叠加(Overlay)系统

lab_pos->setText(QString("坐标: X%1 Y%2").arg(p.x(),0,'f',0).arg(p.y(),0,'f',0));lab_distance->setText(QString("距离: %1 海里").arg(dist,0,'f',1));lab_bearing->setText(QString("方位: %1°").arg(bear,0,'f',1));// 绘制S-57海图基底。scene->addText("封锁线").setPos(450,180);

寒寒豆豆软件公司的博客 496

基于HarmonyOS ArkTS API 24通过new PhotoItem(p)创建一个新的对象并替换数组中的原对象

在任何一个设计精良的应用中,色彩系统都是视觉一致性的基石。bg: string;这段代码定义了一个名为的接口,它包含了11个色彩字段,每个字段都对应应用界面中的一个特定功能角色。primary:主色调,通常用于页面头部、重要按钮等视觉重心区域。在本应用中,主色调选用了深棕色#3E2C23,既呼应了胶片暗房的氛围,又能提供足够的视觉对比度。brown:辅助棕色,用于次级强调元素,如标签背景、评分星星等,与主色调形成层次关系。bg:页面背景色,选用奶油色#F3EBDD。

2501_92985290的博客 952

3.2 直流无刷电机(BLDC):状态空间模型与传递函数

状态空间模型和传递函数是分析BLDC电机动态特性的重要工具。状态空间模型通过微分方程描述系统内部状态与输入输出关系,适用于多变量系统分析;传递函数则在频域表征系统特性,便于控制器设计。本文详细推导了三相坐标系和dq坐标系下的BLDC电机状态空间模型,讨论了线性化方法,并介绍了从状态空间模型到传递函数的转换过程。这些模型为BLDC电机的控制系统设计提供了理论基础。

技术工作者 246

<android>RecyclerView使用GridLayoutManager间距均分等分问题,不要修改xml了太麻烦,一行代码适配所有

/** * recyclerview设置GridLayoutManager 等分margin时的自定义ItemDecoration */ public class RecyclerViewMarginDecoration extends RecyclerView.ItemDecoration { private int mMargin; int spanCount; public RecyclerViewMarginDecoration(Context context, int spanCoun..

csdn_lg_one的博客 4539

【CAD】【手把手带你写一个DXF&JAVA解析框架】02——整理DXF元数据实体类,涵盖重要属性与对照组码

本文系统梳理了DXF文件解析中的核心元数据类,重点分析了Tables段(图层、块记录)、Blocks段和Entities段的关键数据结构。通过详细的组码说明和对照代码实现,阐述了图层定义(DXFLayer)、块记录(DXFBlockRecord)、应用程序标识(DXFAppId)等表对象的属性构成;同时解析了直线(DXFLine)、多段线(DXFLwPolyLine)、圆弧(DXFArc)、文字(DXFText)等实体类的几何特征与属性定义。文章还构建了顶点(Vertex)、基类(DXFEntity、DXF

Wonder ZH 270

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 流布局(根据内容宽度自动换行的布局)

本文引用了http://blog.youkuaiyun.com/gesanri/article/details/48968803博客的代码,并在其基础上修改了一些不足之处。 主要体现在单个内容过多的情况,会出现过多的内容换行时换了多次(根内容行数有关),并且,设置了margin后太长的内容会在宽度上超出屏幕。 将修改好的代码分享如下: import java.util.ArrayList; i

4041

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 自动换行的线性布局

转载请注明出处:在项目中,有时候会有“横向排列,排满后自动换行”的需求(比如下图),要是子view是定长的就没什么好说的了,但如果是变长的话呢?这篇博客会帮你应对这种需求。 基本思路 最外层一层竖直线性布局(我们称为父布局) 新建水平线性布局(我们称为行布局) 计算待放入的view的宽度和行布局的剩下宽度 判断是否可以放入 (1). 若view的宽度小于等于剩余宽度,放入,到第三步; (2)

Jimi_Wu的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Recyclerview使用方法

package com.example.lianxi_recyclerview; public class Bean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.example.lianxi_recycler

李平的博客 2万+

RecyclerView中用GridLayoutManager时如何正确的设置内部控件的间距Margin

GridLayoutManager中如何正确的设置内部控件的间距margin1. 模拟情况2. 踩坑3. 正确用法4. 完整代码和使用例4.1 完整代码4.2 使用例参考材料 最下面有完整代码(仅ItemDecoration类)和使用例,可以直接跳过去查看。 1. 模拟情况 我们用RecyclerView,并采用GridLayoutManager,然后columns设置为3,表示一行有三个item。 item我就用一个带边框的矩形,里面放一个String,width和height都写成固定值50dp。 在什

wodongx123的博客 7687

RecyclerView使用GridLayoutManager 设置间距一致大小

在android应用中,要实现一个Recycleview,使用GridLayoutManager格子排列,且排列成4列 实现水平方向间距均等(没有外边距)。(均分为3列5列等、竖直方向、有边距等原理相同。)先看最终效果图。 --- xml中这样配置 为了醒目,我们让RecyclerView背景是浅绿色。 每一个item的配置如layout_item.xml所示 为了醒目,我们让每一个item的背景色为浅红色。 Activity中,我们这样设置 这样的显示效果,就是,最左边item的左边距离0,

coraline1991的专栏 1万+

不一样的RecyclerView优雅实现复杂列表布局(二)

前言学习了(一)中那个RecyclerView的一些基础知识,如果没有具体看懂可以再返回看不一样的RecyclerView优雅实现复杂列表布局(一),那么接下来我们就在(一)的基础之上,完善稍微复杂一点数据处理。不一样的RecyclerView优雅实现复杂列表布局(二)中使用的是GridLayoutManager模式,实现混合使用的效果: 1.首先加载的数据要有所改变,多种形式的数据加载,在Mai

向着太阳迎着光 5592

RecyclerView使用GridLayoutManager时如何等分间距

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

woaichihuoguoguo的博客 4568

RecyclerView GridLayoutManager列间距

GridLayout模式的时候,如果默认的列宽和比RecyclerView的容量小,那么就会每一列的右侧添加一个间距; 这个间距会导致RecyclerView整体向左偏移的一个效果; 要干掉这个偏移,大体可以通过以下3种手段: 算好RecyclerView的容量大小(即,去掉padding等之后的实际宽度),然后设置列宽的和正好等于这个宽度; 把第一列以外的列往右移; 把整体往右移,然后...

weixin_39821531的博客 7230

RecyclerView GridLayoutManager 等分间距

RecyclerView 表格实现 RecyclerView 配合GridLayoutManager 可以实现类似表格的样式,为了实现均分,adapter 的布局宽度改为匹配父元素,即 android:layout_width=“match_parent” 。 RecyclerView rvPhotoAlbums = findViewById(R.id.rv_photoAlbums_conten...

JM_beizi的专栏 1万+

AndroidRecyclerviewGridLayoutManager列间距 - Android Recyclerview GridLayoutManager column spacing

解决方案: RecyclerViews支持ItemDecoration的概念:特殊补偿和绘画在每个元素。见这个答案,您可以使用然后通过添加 原文: RecyclerViews support the concept of ItemDecoration: special offsets and drawing around each element. As seen in this a

yanggz888的专栏 3万+

Android宫格动态列数,设置recyclerView的GridLayoutManager宫格间距

遇到的问题最近项目中用到了宫格列表布局,一直是用recyclerview作为列表开发控件,自然而然会用到其中的一个属性gridLayoutManager来做宫格布局列表。设计图是两行,并且是左右中都有相同的间距,刚开始想到的是在xml设置间距就行了,出来的效果和设计图的大相径庭,所以这种方法不可行。后来无头绪在度娘一波乱找,了解到了recyclerview还有个addItemDecoration(...

weixin_29997523的博客 1104
上一篇: 并发之痛 Thread,Goroutine,Actor
下一篇: BRVAH的Section中自定义间距,条目完美均分,支持Section顶部和底部间距
candyguy242
博客等级 码龄17年 63粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值