傳送門:一個RecyclerView實現多級摺疊列表(一)java
1.能夠經過後臺控制列表樣式. 2.TreeRecyclerAdapter,能夠展開,摺疊.多級展現 3.adapter可使用裝飾者模式進行擴展.支持EmptyAdapter.能夠添加headview和footview 4.item的樣式能夠編寫文檔,type與Class進行對應,實現後臺控置,相同Item複用.git
1.adapter應該只關心List datas 的內容github
2.把每一個item當作獨立的個體. 佈局樣式,每行所佔比,onbindViewHolder由各個item自實現。bash
3.每個item應該只關心本身的數據和本身的下一級的數據,不會去關心上上級,下下級app
4.展開的實現,點擊時item把子數據拿出來,而後添加到adapter的datas中,變成同級,由於只會展開本身的下級數據。ide
5.摺疊的實現,拿到下級數據(能夠理解由於一個文件夾下文件),而後從adapter的datas中刪除這些數據。佈局
6.後臺控制能夠經過初始化註冊的方法,將Item的Class註冊.保存到集合裏post
7.後臺返回字段,獲取對應class文件,經過Class.newInstance()方法構建實例.優化
8.將ViewHolder與Adapter寫成通用的,不須要再寫多個Adatper與ViewHolder,只須要寫多個Baseitem.與BaseItamData(JavaBean).ui
+ 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歡迎點贊 您的喜歡與回覆是我最大的動力-_-