转载请标明出处:http://www.jianshu.com/p/e96912dd0d06
本文出自:Jlanglang
前言
不得不吐槽一下产品.
尼玛为啥要搞这样的功能....
搞个两级的不就好了嘛...自带控件,多好.
三级,四级,听说还有六级的....
这样丧心病狂的设计,后台也不好给数据吧.
2018年更新:
由于迭代了很多版本,老的文章内容已经不适用,更新一下.
效果及实现代码:
以下实现都只用一个RecycerView,没有嵌套.
三级列表:
购物车:
分类快速定位:
综合(头部,侧滑,定位,折叠):
多样式列表:
如何使用,这里只列出折叠的使用方法:
一.你需要创建一个adapter:
//根据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.
三.写具体展示的item
注意! 使用这个,没有写ViewHolder的概念,只有TreeItem和TreeItemGroup
简单的TreeItemGroup示例,第二级 市:
/**
* 城市
*/
public class CountyItemParent extends TreeItemGroup<ProvinceBean.CityBean> {//泛型代表绑定的javabean
//创建子TreeItem.
@Override
public List<TreeItem> 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());
}
}
简单的TreeItem示例,第三级城市:
/**
* 县
*/
public class AreaItem extends TreeItem<ProvinceBean.CityBean.AreasBean> {//泛型代表绑定的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
怎么创建Item呢?
有两种方法:
1.在javabean上使用注解:
@TreeDataType(iClass = AreaItem.class)
public class AreasBean{
...
}
然后重写在TreeItemGroup中initChildList()
@Override
public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
这样,item就生成了.
2.直接传入item的class,创建item
//创建item
List<TreeItem> provinceItemList = ItemHelperFactory.createItems(cityBeen, ProvinceItemParent.class, null);
List<TreeItem> items = ItemHelperFactory.createItems(cityBeen, null);
这2行代码,效果上是一样的.
四.如何更新adapter:
五,如何设置点击:
条目点击
1.重写TreeItem
的onClick()
:
2.
adapter
设置setOnItemClickListener
adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(@NonNull ViewHolder viewHolder, int position) {
}
});
注意.二者冲突
下面附上github地址,里面有Demo,
传送门:TreeRecyclerView
欢迎Star,哈哈
您的喜欢与回复是我最大的动力,欢迎评论补充.