优主张 2018-01-16
传送门:一个RecyclerView实现多级折叠列表(一)
1.可以通过后台控制列表样式.2.TreeRecyclerAdapter,可以展开,折叠.多级展示3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview4.item的样式可以编写文档,type与Class进行对应,实现后台控置,相同Item复用.
1.adapter应该只关心List datas 的内容
2.把每个item看成独立的个体. 布局样式,每行所占比,onbindViewHolder由各个item自实现。
3.每一个item应该只关心自己的数据和自己的下一级的数据,不会去关心上上级,下下级
4.展开的实现,点击时item把子数据拿出来,然后添加到adapter的datas中,变成同级,因为只会展开自己的下级数据。
5.折叠的实现,拿到下级数据(可以理解因为一个文件夹下文件),然后从adapter的datas中删除这些数据。
6.后台控制可以通过初始化注册的方法,将Item的Class注册.保存到集合里
7.后台返回字段,获取对应class文件,通过Class.newInstance()方法构建实例.
8.将ViewHolder与Adapter写成通用的,不需要再写多个Adatper与ViewHolder,只需要写多个Baseitem.与BaseItamData(JavaBean).
+ 1.Adapter
* Wapper------扩展的wapper,
* EmptyWapper --------当无数据时显示页面.
* HeaderAndFootWapper --------添加头部view和尾部view
- BaseRecyclerAdapter --------封装的Adatper基类
- ItemManager --------接口,管理Adatper刷新,增删操作
- TreeRecyclerAdapter ----多级列表,树形结构的adapter
- TreeRecyclerViewType ----多级列表的显示样式,枚举
- ViewHolder----封装的通用viewHodler
* 2.base
BaseItem<D extends BaseItemData> ------item的封装
BaseItemData-----item的数据要求.javabean需要继承该类.
* 3.factory
ItemConfig ----添加item的class,配置样式
Itemfactory----通过class生成BaseItem的工厂类
* 4.view
TreeItem ----树形列表的子item
TreeItemGroup ----树形列表的父item
TreeParent---TreeItemGroup 实现该接口
TreeSelectItemGroup---可以选中子item的TreeItemGroup. demo:见购物页面
###1.购物页面:

Demo中的代码:
//拿到数据
List<StoreBean> storeBean = initData();
//通过ItemFactory生成第一级Item,如果是通过后台控制,则不需要传Class
//List<ShopTitileItem> itemList = ItemFactory.createItemList(storeBean);
List<ShopTitileItem> itemList = ItemFactory.createItemList(storeBean, ShopTitileItem.class);
//创建TreeRecyclerAdapter
mAdapter = new TreeRecyclerAdapter<>();
//设置adapter的显示样式
mAdapter.setType(TreeRecyclerViewType.SHOW_ALL);
//将数据设置到Adapter中
mAdapter.setDatas(itemList);
//设置adapter
mRecyclerView.setAdapter(mAdapter);
/**
* item的代码
* Created by baozi on 2016/12/22.
*/
public class ShopTitileItem extends TreeSelectItemGroup<StoreBean> {
@Override
protected List<? extends BaseItem> initChildsList(StoreBean data) {
return ItemFactory.createTreeItemList(data.getShopListBeen(), this);
}
@Override
protected int initLayoutId() {
return R.layout.item_shopcart_title;
}
@Override
public void onBindViewHolder(ViewHolder holder) {
holder.setChecked(R.id.cb_ischeck, isHaveCheck());
}
@Override
public void onClick() {
if (!isHaveCheck()) {
getSelectItems().clear();
getSelectItems().addAll(getChilds());
} else {
getSelectItems().clear();
}
int size = getChilds().size();
for (int i = 0; i < size; i++) {
ShopListBean data = (ShopListBean) getChilds().get(i).getData();
data.setCheck(isHaveCheck());
}
getItemManager().notifyDataSetChanged();
}
@Override
public SelectFlag selectFlag() {
return SelectFlag.MULTIPLE_CHOICE;
}
@Override
public boolean canExpandOrCollapse() {
return false;
}
Demo中的代码:
//拿到数据
List<CityBean> cityBeen = initData();
//通过ItemFactory生成List<BaseItem>
List<OneTreeItemParent> itemList = ItemFactory.createItemList(cityBeen);
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter();
//设置数据
treeRecyclerAdapter.setDatas(itemList);
recyclerView.setAdapter(treeRecyclerAdapter);
/**
*item的代码
* Created by baozi on 2016/12/8.
*/
public class OneTreeItemParent extends TreeItemGroup<CityBean> {
@Override
public List<? extends TreeItem> initChildsList(CityBean data) {
return ItemFactory.createTreeItemList(data.getCitys(), TwoTreeItemParent.class, this);
}
@Override
public int initLayoutId() {
return R.layout.itme_one;
}
@Override
public void onBindViewHolder(ViewHolder holder) {
holder.setText(R.id.tv_content, data.getProvinceName());
}
@Override
public boolean canExpandOrCollapse() {
return false;
}
}

---------------------------------分割线---------------------------------------
持续更新优化 -_-传送门:TreeRecyclerView欢迎点赞您的喜欢与回复是我最大的动力-_-