一個RecyclerView實現多級摺疊列表(二)

jlanglang發表於2018-01-16

前言:

傳送門:一個RecyclerView實現多級摺疊列表(一)

要點:

1.可以通過後臺控制列表樣式. 2.TreeRecyclerAdapter,可以展開,摺疊.多級展示 3.adapter可以使用裝飾者模式進行擴充套件.支援EmptyAdapter.可以新增headview和footview 4.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:見購物頁面
複製程式碼
來張醜醜的圖:

Paste_Image.png

具體的使用例項效果:

###1.購物頁面:

Paste_Image.png

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;
    }
複製程式碼

2.多級列表

Paste_Image.png

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;
    }
}
複製程式碼

3.多種type的列表

Paste_Image.png

Paste_Image.png

總結:

1.我覺得像購物車那種頁面挺複雜的,既然寫了多級列表,何不擴充套件一個出來
2.RecyclerView的點選事件,看了很多封裝,發現很多都是每次onBindViewHolder去重新設定一遍,感覺挺不好的.
3.我喜歡把資料集合讓Adatper去持有,然後通過Adapter進行增刪改查操作.直接在Activity裡持有資料集合進行操作,我不是習慣(- -)
4.用的習慣沒bug的才是好東西,如果你覺得實用或者能學到姿勢,就點個贊把,哈哈.
5.大部分的邏輯都在Item中,由於拆分開了,會發現每個item的程式碼也不會很多
6.多級列表我已經用在某個專案裡了(- -),還沒發現什麼問題(多級列表的簡單使用)

---------------------------------分割線---------------------------------------

下面附上github地址,裡面有Demo.詳細程式碼

持續更新優化 -_- 傳送門:TreeRecyclerView歡迎點贊 您的喜歡與回覆是我最大的動力-_-

相關文章