美文网首页
RecyclerView添加GridLayoutManager布

RecyclerView添加GridLayoutManager布

作者: ZenCabin | 来源:发表于2019-02-15 16:51 被阅读3次

RecyclerView使用GridLayoutManager布局,默认情况下布局会如下图所示:

image.png

通常这不是我们想要的效果,一般我们会选择把最右侧的空间去掉,然后布局间隔均分剩余空间,如下图:

image.png

想要达到上图的效果,方法不止一种,比较直观的一种方法是把除第一个以外的其他布局向右移动一定距离来实现。

image.png

理论上是最后测空间均分后分别填充到剩余缝隙去,代码实际操作需要对每一个条目的left进行设置。假设最右侧空间均分后每一份的距离为s,每一项需要移动的距离是前一项的移动距离再加上s。,所以代码可以这样写

首先求出剩余空间,RecyclerView的宽度减去每一个条目的宽度,然后使用剩余宽度和条目个数自定义修饰类SpaceItemDecoration,类里可以对每一个条目自定义left值。

部分代码如下:

{
        final int column = 3;
        GridLayoutManager manager = new GridLayoutManager(getContext(), column);
        guessRecyclerView.setLayoutManager(manager);
        // 减掉RecyclerView父布局两侧padding和item的宽度,然后平分,默认每个item右侧会填充剩余空间
        int spaceWidth = (LuckyContext.screenInfo.width -
                (int) (getResources().getDimension(R.dimen.dd_dimen_20px) * 2) -
                (int) (getResources().getDimension(R.dimen.dd_dimen_210px) * column)) / (column * (column - 1));
        guessRecyclerView.addItemDecoration(new SpaceItemDecoration(spaceWidth, column));

}

// 自定义条目修饰类
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
        private final int column;
        private final int space;

        public SpaceItemDecoration(int space, int column) {
            this.space = space;
            this.column = column;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            // 第一列左边贴边、后边列项依次移动一个space和前一项移动的距离之和
            int mod = parent.getChildAdapterPosition(view) % column;
            outRect.left = space * mod;
        }
    }

后记:

其实还有一种较为方便的方法,通常手机常见的宽度有320dp、360dp几种,如果我们适配使用的是dp这种方式,那么不兼容的情况可能就是宽度的并不是上述几种,比如我的小米8的宽度就是392dp,这种情况可以单独新建layout-w392dp、或者value-w392dp在其中对长度进行单独设值。不过小米8可以手动修改宽度的dp值,如果是用户手动修改了宽度值,那这么做可能就没有效果了(⊙﹏⊙)!!

相关文章

网友评论

      本文标题:RecyclerView添加GridLayoutManager布

      本文链接:https://www.haomeiwen.com/subject/malmeqtx.html