一个RecyclerView实现QQ空间相册布局

这里写图片描述

看到这布局自然会想到用RecyclerView来做,用ItemDecoration绘制日期那条分割线,每行3列的GridLayoutManager
但是有个问题,如果不是正好3列、怎么去控制末尾的留白呢?

我的实现思路是这样的:

GridLayoutManager中有个setSpanSizeLookup方法,getSpanSize返回值就是控制每行有几列的

 gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return setSpanSize(position, mAdapter.getDatas());
            }
        });

不了解的可以转至RecyclerView通过GridLayoutManager实现多样式布局

采用了setSpanSizeLookup方法

也就是说使用该方法我可以控制每一行的列数、只要我再控制其长度就OK了

在数据实体中添加一个value、用来记录当前图片和前面差了几个空白,从而确定留白的距离

 private int setSpanSize(int position, List<AlbumBean> listEntities) {
        int count;
        int d;
        if ((position + 1 < listEntities.size()) && position > 0) {
            if (!listEntities.get(position).getSubId().equals(listEntities.get(position + 1).getSubId())) {
                mAdapter.getItem(position + 1).value = 2 - (mAdapter.getItem(position).value + position) % 3 
                                                       + mAdapter.getItem(position).value;
                d = 2 - (mAdapter.getItem(position).value + position) % 3;
                if (d == 2) {
                    count = 3;
                } else if (d == 1) {
                    count = 2;
                } else {
                    count = 1;
                }
            } else {
                mAdapter.getItem(position + 1).value = mAdapter.getItem(position).value;
                count = 1;
            }
        } else if (position == 0) {
            if (mAdapter.getDatas().size() > 1) {
                if ((!listEntities.get(position).getSubId().equals(listEntities.get(position + 1).getSubId()))) {
                    mAdapter.getItem(1).value = 2;
                    count = 3;
                } else {
                    count = 1;
                    mAdapter.getItem(1).value = 0;
                }
            } else {
                count = 1;
            }
        } else {
            count = 1;
        }
        return count;
    }

完成效果:

完成效果图


Github地址:https://github.com/forvv231
安装包下载:https://fir.im/QQAlbum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值