最近项目中有个需求,在一个线性布局,放多个recyclerview,recyclerview展示的是一个grid,效果如下。
1.分析解决方案
起初是想用recyclerview嵌套recyclerview,但是因为子view高度的问题,总是出现白色区域,找了很多方法,都达不到效果,没办法,转换一下思路,要实现这一效果,可以采用向LinearLayout动态添加子View的方法,实现这一效果,废话不多说,直接分析数据结构,上代码。
2.数据结构
看下我们的数据,长这样,一个从服务器返回或者加工过的是List,同时里面嵌套了List,模拟下:
public class AppendObj {
private String name;
private List<AppendObj> children;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<AppendObj> getChildren() {
return children;
}
public void setChildren(List<AppendObj> children) {
this.children = children;
}
}
构建数据如下
private void getData() {
AppendObj dto;
datalist = new ArrayList<AppendObj>();
for (int i = 0; i < 5; i++) {
dto = new AppendObj();
dto.setName("名称" + i);
List<AppendObj> children = new ArrayList<AppendObj>();
for (int j = 0; j < 10; j++) {
AppendObj obj = new AppendObj();
obj.setName(i * j + "");
children.add(obj);
}
dto.setChildren(children);
datalist.add(dto);
}
}
3.获得最终结果
这里的 AppendAdapter 就不用多做介绍了吧,另外parent是主Activity里面的一个父View,用来存放各个含recycleview的子View,核心代码如下:
private void initView() {
for (AppendObj obj : datalist) {
View view = LayoutInflater.from(this).inflate(R.layout.layout_recyclerview, null);
TextView name = (TextView) view.findViewById(R.id.children_name_text);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.children_recyclerview);
name.setText(obj.getName());
GridLayoutManager manager = new GridLayoutManager(context, 3);
AppendAdapter adapter = new AppendAdapter(context, obj.getChildren());
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(adapter);
parent.addView(view);
}
}
总结
至此,功能完成,截图如下,略显粗糙,有时间优化下,上传到git上