Recyclerview之瀑布流分割线

编程入门 行业动态 更新时间:2024-10-09 15:23:10

Recyclerview之<a href=https://www.elefans.com/category/jswz/34/1762263.html style=瀑布流分割线"/>

Recyclerview之瀑布流分割线

本文改进自Recyclerview之瀑布流分割线左右间距均等问题

 

根据这篇文章的设置以后,显示效果如下:

这样显示时没有问题的。

可是当我改成3列时:

很明显,分割线错乱了。

因为代码里写死了列数

        /*** 根据params.getSpanIndex()来判断左右边确定分割线* 第一列设置左边距为space,右边距为space/2  (第二列反之)*/if (params.getSpanIndex() % 2 == 0) {outRect.left = space;outRect.right = space / 2;} else {outRect.left = space / 2;outRect.right = space;}

那把里面的2改成变量就可以了? 并不是。

我们回过头来想一想,无论是瀑布流还是网格布局,我们所需要处理的只是最左边和最右边的分割线,不管是多少列,中间有多少,中间的部分左右都是一半的间距。

所以我们只需要知道当前的View是在哪个位置即可。是在最左边还是中间的还是最右边的。

那么下面从当前View的position入手。

经过一番比划,我发现如下规律:

 

position : 当前位置

column:列数

row :行数 = position/column +1

最左边的 : column*row - position = column

最右边的 : column*row - position = 1

 

那么按照这个方法设置之后,得到的结果,依然如图2所示。

这是为什么呢?

原来瀑布流是从上面布局最短处开始的。

白忙活,回过头再看看这个是啥玩意 

 StaggeredGridLayoutManager.LayoutParams params =(StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();// 当前位置int position = params.getSpanIndex();

日志如下:

这玩意不就是我们要的位置吗?

那剩下的就简单了

    @Overridepublic void getItemOffsets(Rect outRect, View view,RecyclerView parent, RecyclerView.State state) {StaggeredGridLayoutManager.LayoutParams params =(StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();// 当前位置int position = params.getSpanIndex();int X = column - position;if(X == column){// 最左边outRect.left = space;outRect.right = halfSpace;}else if(X == 1){// 最右边outRect.left = halfSpace;outRect.right = space;}else{outRect.left = halfSpace;outRect.right = halfSpace;}outRect.bottom = space;}

最后看看效果:

4列呢?

 

然而,当为1列时:

 

这时position一直都是为0,永远都是最左边的状态。

所以这里得改一下:

    @Overridepublic void getItemOffsets(Rect outRect, View view,RecyclerView parent, RecyclerView.State state) {outRect.left = space;outRect.right = space;if (column != 1) {StaggeredGridLayoutManager.LayoutParams params =(StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();// 当前位置int position = params.getSpanIndex();int X = column - position;if (X == column) {// 最左边outRect.right = halfSpace;} else if (X == 1) {// 最右边outRect.left = halfSpace;} else {outRect.left = halfSpace;outRect.right = halfSpace;}}outRect.bottom = space;}

至于第一行顶部要不要加自行判断吧。

网格的话这里改一下也是可以直接使用的。

 @Overridepublic void getItemOffsets(Rect outRect, View view,RecyclerView parent, RecyclerView.State state) {outRect.left = space;outRect.right = space;if (column != 1) {int position;if(parent.getLayoutManager() instanceof StaggeredGridLayoutManager){StaggeredGridLayoutManager.LayoutParams params =(StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();// 当前位置position = params.getSpanIndex();}else{GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();position = params.getSpanIndex();}int X = column - position;if (X == column) {// 最左边outRect.right = halfSpace;} else if (X == 1) {// 最右边outRect.left = halfSpace;} else {outRect.left = halfSpace;outRect.right = halfSpace;}}outRect.bottom = space;}

好了就这么多了。

更多推荐

Recyclerview之瀑布流分割线

本文发布于:2024-03-23 17:46:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1741000.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:瀑布   分割线   Recyclerview

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!