一個RecyclerView實現(xiàn)多級折疊列表(二)

轉(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:見購物頁面
來張丑丑的圖:
Paste_Image.png

具體的使用實例效果:

1.購物頁面:

Paste_Image.png

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.多級列表

Paste_Image.png

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的列表

Paste_Image.png
Paste_Image.png

總結(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ù),付費快速解決問題.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市噩死,隨后出現(xiàn)的幾起案子颤难,更是在濱河造成了極大的恐慌,老刑警劉巖已维,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件行嗤,死亡現(xiàn)場離奇詭異,居然都是意外死亡垛耳,警方通過查閱死者的電腦和手機栅屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門飘千,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栈雳,你說我怎么就攤上這事护奈。” “怎么了哥纫?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵霉旗,是天一觀的道長。 經(jīng)常有香客問我蛀骇,道長厌秒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任松靡,我火速辦了婚禮简僧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雕欺。我一直安慰自己岛马,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布屠列。 她就那樣靜靜地躺著啦逆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笛洛。 梳的紋絲不亂的頭發(fā)上夏志,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音苛让,去河邊找鬼沟蔑。 笑死,一個胖子當著我的面吹牛狱杰,可吹牛的內(nèi)容都是我干的瘦材。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仿畸,長吁一口氣:“原來是場噩夢啊……” “哼食棕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起错沽,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤簿晓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后千埃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憔儿,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年放可,在試婚紗的時候發(fā)現(xiàn)自己被綠了谒臼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唱逢。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屋休,靈堂內(nèi)的尸體忽然破棺而出坞古,到底是詐尸還是另有隱情,我是刑警寧澤劫樟,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布痪枫,位于F島的核電站,受9級特大地震影響叠艳,放射性物質(zhì)發(fā)生泄漏奶陈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一附较、第九天 我趴在偏房一處隱蔽的房頂上張望吃粒。 院中可真熱鬧,春花似錦拒课、人聲如沸徐勃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僻肖。三九已至,卻和暖如春卢鹦,著一層夾襖步出監(jiān)牢的瞬間臀脏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工冀自, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揉稚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓熬粗,卻偏偏與公主長得像搀玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荐糜,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容