RecyclerView GridLayoutManager实现复杂的列数变化的布局

遇到复杂的不规则列(即有的行显示的列数多,有的行显示的列数少,并且每列显示的内容页不一样)。对于这种需求在RecyclerView出来之前的解决方案,要么就是ListView中嵌套GirdView,要么就直接使用ScrollView,勉强可以实现此效果,但是这两种实现都有非常大的缺陷,即都不能进行item的复用。

GridLayoutManager.SpanSizeLookup

可以使用GridLayoutManager结合GridLayoutManager.SpanSizeLookup的相关功能实现,创建GridLayoutManager时列数填写所有可能列数的最小公倍数。再结合Aadapter中的:

1
2
3
4
@Override
public int getItemViewType(int position) {
return position == 0 ? 0 : type;
}

即可实现。实现的关键代码如下:

1
2
3
4
5
6
7
8
GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position == 0 ? 2 : 1; //此句代码设置对应position位置item的跨列数,第一行显示一列,其他行显示两列
}
});
recyclerView.setLayoutManager(layoutManager);

GridLayoutManager设置某个item类型占据的列数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 将RecyclerView网格布局中的某个item设置为独占一行、只占一列,只占两列等等
* @param gridLayoutManager
*/
private void setSpanCount(GridLayoutManager gridLayoutManager) {
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = getItemViewType(position);
if (type == TYPE_NORMAL_ITEM) {
return 1; //只占一行中的一列
} else {
return gridLayoutManager.getSpanCount(); //独占一行
}
}
});
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :