看到这布局自然会想到用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实现多样式布局
也就是说使用该方法我可以控制每一行的列数、只要我再控制其长度就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