轉(zhuǎn)載請標明出處:http://www.reibang.com/p/a47dc3b526d0
本文出自:Jlanglang
前言:
傳送門:一個RecyclerView實現(xiàn)多級折疊列表(一)
要點:
1.可以通過后臺控制列表樣式.
2.TreeRecyclerAdapter,可以展開,折疊.多級展示
3.adapter可以使用裝飾者模式進行擴展.支持EmptyAdapter.可以添加headview和footview
4.item的樣式可以編寫文檔,type與Class進行對應(yīng),實現(xiàn)后臺控置,相同Item復(fù)用.
思路:
1.adapter應(yīng)該只關(guān)心List<baseItem> datas 的內(nèi)容
2.把每個item看成獨立的個體. 布局樣式,每行所占比,onbindViewHolder由各個item自實現(xiàn)。
3.每一個item應(yīng)該只關(guān)心自己的數(shù)據(jù)和自己的下一級的數(shù)據(jù),不會去關(guān)心上上級摔刁,下下級
4.展開的實現(xiàn),點擊時item把子數(shù)據(jù)拿出來,然后添加到adapter的datas中负拟,變成同級栈虚,因為只會展開自己的下級數(shù)據(jù)。
5.折疊的實現(xiàn),拿到下級數(shù)據(jù)(可以理解因為一個文件夾下文件),然后從adapter的datas中刪除這些數(shù)據(jù)妨蛹。
6.后臺控制可以通過初始化注冊的方法,將Item的Class注冊.保存到集合里
7.后臺返回字段,獲取對應(yīng)class文件,通過Class.newInstance()方法構(gòu)建實例.
8.將ViewHolder與Adapter寫成通用的,不需要再寫多個Adatper與ViewHolder,只需要寫多個Baseitem.與BaseItamData(JavaBean).
目錄介紹
+ 1.Adapter
* Wapper------擴展的wapper,
* EmptyWapper --------當無數(shù)據(jù)時顯示頁面.
* HeaderAndFootWapper --------添加頭部view和尾部view
- BaseRecyclerAdapter --------封裝的Adatper基類
- ItemManager --------接口,管理Adatper刷新,增刪操作
- TreeRecyclerAdapter ----多級列表,樹形結(jié)構(gòu)的adapter
- TreeRecyclerViewType ----多級列表的顯示樣式,枚舉
- ViewHolder----封裝的通用viewHodler
* 2.base
BaseItem<D extends BaseItemData> ------item的封裝
BaseItemData-----item的數(shù)據(jù)要求.javabean需要繼承該類.
* 3.factory
ItemConfig ----添加item的class,配置樣式
Itemfactory----通過class生成BaseItem的工廠類
* 4.view
TreeItem ----樹形列表的子item
TreeItemGroup ----樹形列表的父item
TreeParent---TreeItemGroup 實現(xiàn)該接口
TreeSelectItemGroup---可以選中子item的TreeItemGroup. demo:見購物頁面
來張丑丑的圖:
具體的使用實例效果:
1.購物頁面:
Demo中的代碼:
//拿到數(shù)據(jù)
List<StoreBean> storeBean = initData();
//通過ItemFactory生成第一級Item,如果是通過后臺控制,則不需要傳Class
//List<ShopTitileItem> itemList = ItemFactory.createItemList(storeBean);
List<ShopTitileItem> itemList = ItemFactory.createItemList(storeBean, ShopTitileItem.class);
//創(chuàng)建TreeRecyclerAdapter
mAdapter = new TreeRecyclerAdapter<>();
//設(shè)置adapter的顯示樣式
mAdapter.setType(TreeRecyclerViewType.SHOW_ALL);
//將數(shù)據(jù)設(shè)置到Adapter中
mAdapter.setDatas(itemList);
//設(shè)置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;
}
2.多級列表
Demo中的代碼:
//拿到數(shù)據(jù)
List<CityBean> cityBeen = initData();
//通過ItemFactory生成List<BaseItem>
List<OneTreeItemParent> itemList = ItemFactory.createItemList(cityBeen);
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter();
//設(shè)置數(shù)據(jù)
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;
}
}
3.多種type的列表
總結(jié):
1.我覺得像購物車那種頁面挺復(fù)雜的,既然寫了多級列表,何不擴展一個出來
2.RecyclerView的點擊事件,看了很多封裝,發(fā)現(xiàn)很多都是每次onBindViewHolder去重新設(shè)置一遍,感覺挺不好的.
3.我喜歡把數(shù)據(jù)集合讓Adatper去持有,然后通過Adapter進行增刪改查操作.直接在Activity里持有數(shù)據(jù)集合進行操作,我不是習(xí)慣(- -)
4.用的習(xí)慣沒bug的才是好東西,如果你覺得實用或者能學(xué)到姿勢,就點個贊把,哈哈.
5.大部分的邏輯都在Item中晴竞,由于拆分開了蛙卤,會發(fā)現(xiàn)每個item的代碼也不會很多
6.多級列表我已經(jīng)用在某個項目里了(- -),還沒發(fā)現(xiàn)什么問題(多級列表的簡單使用)
---------------------------------分割線---------------------------------------
下面附上github地址,里面有Demo.詳細代碼
持續(xù)更新優(yōu)化 -_-
傳送門:TreeRecyclerView歡迎點贊
交流群:493180098,這是個很少吹水,交流學(xué)習(xí)的群.
APP開發(fā)維護咨詢?nèi)?: 492685472 承接APP迭代.開發(fā)維護.咨詢業(yè)務(wù),付費快速解決問題.