摘要:先上效果圖該多級列表的優(yōu)勢支持無限級列表展開基于一個(gè)實(shí)現(xiàn)可以自定義每一級的樣式,定制化更強(qiáng)設(shè)計(jì)的思路數(shù)據(jù)結(jié)構(gòu)類中有變量構(gòu)造整體的數(shù)據(jù)源因?yàn)楸緛砭椭С侄鄠€(gè)的布局,不清楚的可以看下這個(gè)方法,所以我們可以利用這個(gè)類,來區(qū)分不同級用不同的。
先上效果圖:
支持無限級列表展開
基于一個(gè)recyclerView實(shí)現(xiàn)
可以自定義每一級item的樣式,定制化更強(qiáng)
2.設(shè)計(jì)的思路數(shù)據(jù)結(jié)構(gòu)List
因?yàn)镽ecyclerView.Adapter本來就支持多個(gè)type的item布局,不清楚的可以看下getItemViewType這個(gè)方法,所以我們可以利用這個(gè)類,來區(qū)分不同級用不同的Item。
將Item必須具備的方法放在一個(gè)Tree接口里面,以后自定義的類只需要繼承Tree接口就好了。
3.代碼分析public abstract class BaseTreeRVAdapterextends BaseRVAdapterV2 { @Override public void onBindViewHolder(T holder, final int position) { try { getLevel(position, mDatas, new PosBean()); } catch (StopMsgException ex) { int type = Integer.parseInt(ex.getMessage()); M tree = ex.getTree(); onBindViewHolder(type, tree, holder); } } @Override public int getItemViewType(int position) { try { getLevel(position, mDatas, new PosBean()); } catch (StopMsgException ex) { return Integer.parseInt(ex.getMessage()); } return 0; } @Override public int getItemCount() { return getTotal(mDatas); } protected abstract void onBindViewHolder(int type, M tree, T holder); public List getDatas() { return mDatas; } public void setDatas(List info) { if (info != null) { mDatas = info; } else { mDatas.clear(); } notifyDataSetChanged(); } }
注釋1:主要是計(jì)算當(dāng)前給的數(shù)據(jù)他的item個(gè)數(shù),會根據(jù)是否展開的狀態(tài)來統(tǒng)總個(gè)數(shù)
注釋2:計(jì)算當(dāng)前的postion對應(yīng)的item層級,來顯示對應(yīng)的item布局
4.對于自己需要實(shí)現(xiàn)的地方public class TreeListAdapter extends BaseTreeRVAdapter{ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; RecyclerView.ViewHolder vh; switch (viewType) { case 0: ...... break; case 1: ...... break; case 2: ...... break; case 3: case 4: ...... } return vh; } @Override protected void onBindViewHolder(int type, final DiscountItem itemCategoryListBean, RecyclerView.ViewHolder holder) { switch (type) { case 0: ...... break; case 1: ...... break; case 2: ...... break; case 3: case 4: ...... } } }
上面的泛型T就是我們的Item的class類型,所以自定義的class要想用這個(gè)adapter的話,都需要實(shí)現(xiàn)Tree接口
onBindViewHolder方法中形參的的type就是層級,比如說第一級type就是0,第二級是1,以此類推
5.另外自定義的類如果不需要extends的話,那么需要繼承wellijohn.org.treerecyclerview.vo.TreeItem,如果已經(jīng)寫了的話,那么就需要自己實(shí)現(xiàn)Tree接口。必須實(shí)現(xiàn)的幾個(gè)方法:
int getLevel();//每個(gè)item的層級,比如一級就是0,二級就返回1,這里的0和1可以自己定義,后面就是根據(jù)這個(gè)來選擇哪種樣式的item List6.引入方式getChilds();//返回的子列表,比如當(dāng)前類是一級的話,那么這個(gè)方法返回的是二級的列表數(shù)據(jù) boolean isExpand();//是否展開,true展開,false不展開,一般就是點(diǎn)擊下去修改這個(gè)值刷新adapter,就能達(dá)到展開還是折疊的目的了
step 1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url "https://jitpack.io" } } } Step 2. Add the dependency dependencies { implementation "com.github.WelliJohn:MultiLevelRecyclerView:0.0.1" }7.demo示例
多級列表示例,如果覺得有用,還請點(diǎn)個(gè)贊。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/76800.html
摘要:數(shù)據(jù)源頻繁更新的場景,如彈幕等的優(yōu)勢會非常明顯進(jìn)一步來講,結(jié)論是列表頁展示界面,需要支持動畫,或者頻繁更新,局部刷新,建議使用,更加強(qiáng)大完善,易擴(kuò)展其它情況如微信卡包列表頁兩者都,但在使用上會更加方便,快捷。 本文來自于騰訊bugly開發(fā)者社區(qū),非經(jīng)作者同意,請勿轉(zhuǎn)載,原文地址:http://dev.qq.com/topic/5811d... 作者:黃寧源 一,背景 RecyclerV...
閱讀 1907·2023-04-26 01:55
閱讀 1149·2021-09-30 09:47
閱讀 1746·2019-08-30 15:54
閱讀 802·2019-08-30 15:53
閱讀 757·2019-08-30 15:52
閱讀 1199·2019-08-30 15:44
閱讀 2484·2019-08-30 14:06
閱讀 1120·2019-08-29 16:39