如何自定义RecycleView item的间距
引言
在以前使用ListView和GridView时,设置item之间的间距还是相对比较简单的,因为它们的基本属性里面Android已经定义好了,可以直接设置属性值即可。但Google为了通用性和灵活性(至少我是这么认为-.-),对于V7包中的RecycleView来说,则需要自己实现ItemDecoration类的getItemOffsets(Rect outRect, View view,... ...)抽象方法。
局限
下面的推理只限于VERTICAL情况,至于HORIZONTAL情况的考虑方式应该是类似,大家就自行去考虑把,嘿嘿o(∩_∩)o
推理
嗯,接下来就是根据不同的布局情况找到item的outRect的计算规律(outRect负责存储item之间间距)。
首先对于RecycleView的LayoutManager为LinearLayoutManager,或者为GridLayoutManager但spanCount为1的情况先忽略,因为太简单了=。= 。
我们接下的考虑重点是当RecycleView的LayoutManager为GridLayoutManager且spanCount大于1的情况(暂且默认每个Item的spanSize的大小都为1,后面为具体讨论)。
其实仔细观察后你会发现,outRect的top和bottom计算远比right和left简单的多,因为在VERTICAL情况下,高度是没有限制的,所以我们计算时需要保证只对第一行的item的outRect.top赋值,对每个item的outRect.bottom都赋值即可,这样就可以保证每行item都在统一水平线上且垂直相隔的距离都是相等的。主要代码如下:
// set top to all in first lane
if (position < mCountInFirstLine) {
outRect.top = mSpace;
}
outRect.bottom = mSpace;
对于outRect的right和left的计算,首先要明确的是三个已知条件,分别如下:
假设每个item间的左右间距为D(D>=0,常量),一共有n个item(1,2,3,... ... n),第i个item的左间隔距离为 \(x_{i}\),右间隔距离为\(y_{i}\) (1<=i<=n,i为自然数) 。
$ x_{i}+ y_{i}=d (1<=i<=n,i为自然数,d为未知正数)$
\(y_{i}+x_{i+1}=D(1<i<=n)\)
\(x_{1}=D, y_{1}=D\)
其中需要说明的是,由于每个item的原始宽度一致,要使得每个item的左右边距在空出相应距离后仍宽度一致,则公式1一定成立,具体示意图如下:
由图可知,自然的我们可以很快的找到一个等式①,即:
\]
而由公式1可知:$$x_{i}+ y_{i}=d,即y_{i}=d-x_{i}$$
所以等式①为:$$nd=(n+1)D,即d=D+D/n$$
这就是d的计算公式,当然到这里证明还没有结束,我们联合公式1和公式2可知:$$x_{i+1}-x_{i}+d=D,即x_{i+1}-x_{i}=-D/n(其中0<i<n,n>=1)$$
显然这是一个标准的等差数列,同时由公式3可知:\(x_{1}=D\),则第i个item的左间隔距离计算公式为:$$x_{i}=D-D/ni(其中0<i<=n,n>=1)$$再由公式1和等式①即可推得$$y_{i}=D/n+D/ni(其中0<i<=n,n>=1)$$至此关于item的左右间隔距离的计算公式基本证明结束。
进一步推理
当然上述的推理结果是默认每个Item的spanSize的大小都为1为前提条件进行的,所以为了公式更加通用,下面我们具体讨论当spanSize大小不固定的情况。
首先需要明确的是spanSize的大小并不影响item的outRect.top和outRect.bottom的计算(原因可自行脑补=.=)。
而当每个item的spansize大小不一样时,关于item的outRect.left和outRect.right的计算其实和spanSize=1的情况是基本一样的,我们只需要换个思维方式,即一个spanSize=N的item可以看作是N个spanSize=1的item,其中N>0,且N为自然数,$$item_{spanSize=N}的x=x_{1}$$$$item_{spanSize=N}的y=y_{N}$$
具体公式如下:$$x_{i}=D-D/nai(其中0<ai<=n,n>=1)$$ $$y_{i}=D/n+D/n(ai+item_{i的spanSize}-1)(其中0<ai<=n,n>=1)$$
其中需要注意的是ai表示的该item在一行中的实际位置,即若第一个\(item_{spanSize=2}\)的ai=1时,第二个\(item\)的ai=3。
OK,至此公式的推理全部结束,有关示例源码下载连接。
题外
唉,当初理清这些关系真的是花了好久(主要是好久不做数学题,生疏了-。-),希望能给大家提供些帮助,当然若有不足的地方欢迎指正。
这是搬到上海来写的第一篇文章,真的是“憋”了好久(─.─)|||,以后得更加勤快些,不能颓废下来。
作者:XycZero
查看原文:http://www.xyczero.com/blog/article/23/.
如何自定义RecycleView item的间距的更多相关文章
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...
- iOS11UINavigationBar的item左右间距调整
相信很多同学都知道在iOS7之后调整导航栏两侧按钮距离左右间距,其实就是在左右barButtonItem的数组中添加一个宽度为负的占位item. - (void)addLeftBarButtonIte ...
- Android 自定义TextView 实现文本间距
Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...
- NGUI 自定义 Drag Item Script
最近要实现一个NGUI效果. 查看了一下,NGUI有个自带 UIDragDropItem.cs 的组件进过修改后即可以实现. 下面贴上UI布局,代码: mDragDropItem.cs using U ...
- Typora 自定义主题 修改左右间距
打开偏好设置,打开主题文件夹 比如要修改night主题中的间距,编辑night.css文件,修改#write样式即可. 修改其他样式类试.
- Android 自定义ListView Item侧滑删除
本程序是基于网上开源项目修改而来,具体来源忘了,懒得搜了,如果有不合适的地方,请原作者联系我,我会及时回复和处理的! 该例子程序中主要包含两个ListView,一个是实现侧滑删除,一个是侧滑出菜单,代 ...
- Android ExpandableListView group的item有间距child间隔不变
<ExpandableListView android:id="@+id/lv" android:layout_width="fill_parent" a ...
- Android recycleview item水波纹效果
item的xml 根标签下添加如下三个属性 android:clickable="true" android:focusable="true" android: ...
- listview自定义背景以及item自定义背景
item向自定义背景,可以根据position来设置不同的背景. listview背景设置是需要注意设置下面这几项: //点下时整个页面的背景 android:cacheColorHint=" ...
随机推荐
- Intellij IDEA 导入Eclipse或MyEclipse的Web项目(旧版 转载)
Intellij IDEA 导入Eclipse或MyEclipse的Web项目 博客分类: Intellig IDEA Intellij IDEAEclipseWeb Intellij IDEA 导 ...
- sql Server 发送邮件 错误类型及原因
设置警报 在[常规项]中做以下设置 新建警报 设置警报名称 选择数据库 选择严重性 在[响应项]中可以做以下设置 选择要邮件通知的操作员 可以设置执行一个警报作业 在选项 ...
- Android 动画之RotateAnimation应用详解
android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 TranslateAnimation 位移动画效果 RotateAnimat ...
- 【Linux常用工具】1.1 diff命令的三种格式
diff是用来比较两个文本文件的差异的工具,它有三种格式,下面用实例介绍一下: 准备三个测试文件1.txt 2.txt 3.txt bixiaopeng@bixiaopengtekiMacBook-P ...
- grep:Binary file (standard input) matches
grep "key" xxx.log时输出 Binary file xxx.log matches 百度了一下:grep觉得这是二进制文件.解决方式:grep -a. grep - ...
- RGB的三维模型与渐变色-颜色系列之一
一.前言 以下与颜色相关的日志记录了俺学习颜色的有关容,限于编写时的水平,难免存在缺点与错误,希望得到朋友.同行和前辈的指教,非常感谢.1. RGB的三维模型与渐变色-颜色系列之一2. <颜 ...
- FreeCodeCamp 的 Basic Algorithm Scripting 题解(1)
这是本人的原创文章,转载请注明原文链接http://www.cnblogs.com/wusuowiaaa1blog/p/5932121.html. 1.Reverse a String 翻转字符串 先 ...
- Python_oldboy_自动化运维之路(一)
python简介: Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有 ...
- C#生成缩略图不清晰模糊问题的解决方案!
之前网上找了个生成缩略图的代码,改了改直接用了.问题来了,等比例缩略图时总是发现左边.上边的边线大概有一像素的白边,领导不乐意了,那咱就改吧.图片放大了才发现,那个好像是渐变的颜色,晕,这样的功能领导 ...
- java 更改list 某一元素?
if(!elTd.getElementsByTag("p").isEmpty()){ int i=eduList.size(); if(i>0){ ...