不得不吐槽一下产品.
尼玛为啥要搞这样的功能…
搞个两级的不就好了嘛…自带控件,多好.
三级,四级,听说还有六级的…
这样丧心病狂的设计,后台也不好给数据吧.
由于迭代了很多版本,老的文章内容已经不适用,更新一下.
以下实现都只用一个RecycerView,没有嵌套.
//根据item的状态展示,可折叠
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);
public TreeRecyclerAdapter() {
this(null);
}
public TreeRecyclerAdapter(TreeRecyclerType treeRecyclerType) {
type = treeRecyclerType == null ? TreeRecyclerType.SHOW_DEFAULT : treeRecyclerType;
}
构造函数传入,不传默认则使用SHOW_DEFAULT.
注意! 使用这个,没有写ViewHolder的概念,只有TreeItem和TreeItemGroup
/**
* 城市
*/
public class CountyItemParent extends TreeItemGroup {//泛型代表绑定的javabean
//创建子TreeItem.
@Override
public List initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
//该级具体展示的Layout
@Override
public int getLayoutId() {
return R.layout.item_two;
}
//view和data绑定
@Override
public void onBindViewHolder(@NonNull ViewHolder holder) {
holder.setText(R.id.tv_content, data.getCityName());
}
}
/**
* 县
*/
public class AreaItem extends TreeItem {//泛型代表绑定的javabean
//这个item的具体展示layout
@Override
public int getLayoutId() {
return R.layout.item_three;
}
//这个Item条目的视图绑定操作,
@Override
public void onBindViewHolder(@NonNull ViewHolder holder) {
holder.setText(R.id.tv_content, data.getAreaName());
}
//这个Item,在RecyclerView的每行所占比,只有RecyclerView设置了GridLayoutManager才会生效.
//这个最好是返回能整出的数.之所以用除法,是为了可以做到,只改变GridLayoutManager的总数,无需改变Item
@Override
public int getSpanSize(int maxSpan) {
return maxSpan / 6;
}
}
第一级为啥没写呢? 因为写法和第二级一样的,就不写出来了.具体见demo
有两种方法:
@TreeDataType(iClass = AreaItem.class)
public class AreasBean{
...
}
然后重写在TreeItemGroup中initChildList()
@Override
public List initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
这样,item就生成了.
//创建item
List provinceItemList = ItemHelperFactory.createItems(cityBeen, ProvinceItemParent.class, null);
List items = ItemHelperFactory.createItems(cityBeen, null);
这2行代码,效果上是一样的.
1.重写TreeItem
的onClick()
:
2.adapter
设置setOnItemClickListener
adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(@NonNull ViewHolder viewHolder, int position) {
}
});
注意.二者冲突
您的喜欢与回复是我最大的动力,欢迎评论补充.