打造RecyclerView的n級列表
阿新 • • 發佈:2018-08-20
... extend 表數 osb type mda 是否 else 二級 先上效果圖:
1.該多級列表的優勢:
- 支持無限級列表展開
- 基於一個recyclerView實現
- 可以自定義每一級item的樣式,定制化更強
2.設計的思路
- 數據結構List<ItemBean>,ItemBean類中有變量List<ItemBean>,構造整體RecyclerView的數據源
- 因為RecyclerView.Adapter本來就支持多個type的item布局,不清楚的可以看下getItemViewType這個方法,所以我們可以利用這個類,來區分不同級用不同的Item。
- 將Item必須具備的方法放在一個Tree接口裏面,以後自定義的類只需要繼承Tree接口就好了。
3.代碼分析
public abstract class BaseTreeRVAdapter<T extends RecyclerView.ViewHolder, M extends Tree> extends BaseRVAdapterV2<T, M> { @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<M> getDatas() { return mDatas; } public void setDatas(List<M> info) { if (info != null) { mDatas = info; } else { mDatas.clear(); } notifyDataSetChanged(); } }
註釋1:主要是計算當前給的數據他的item個數,會根據是否展開的狀態來統總個數
註釋2:計算當前的postion對應的item層級,來顯示對應的item布局
4.對於自己需要實現的地方
public class TreeListAdapter extends BaseTreeRVAdapter<RecyclerView.ViewHolder, T extends Tree> { @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要想用這個adapter的話,都需要實現Tree接口
- onBindViewHolder方法中形參的的type就是層級,比如說第一級type就是0,第二級是1,以此類推
5.另外自定義的類如果不需要extends的話,那麽需要繼承wellijohn.org.treerecyclerview.vo.TreeItem,如果已經寫了的話,那麽就需要自己實現Tree接口。
必須實現的幾個方法:
int getLevel();//每個item的層級,比如一級就是0,二級就返回1,這裏的0和1可以自己定義,後面就是根據這個來選擇哪種樣式的item
List<T> getChilds();//返回的子列表,比如當前類是一級的話,那麽這個方法返回的是二級的列表數據
boolean isExpand();//是否展開,true展開,false不展開,一般就是點擊下去修改這個值刷新adapter,就能達到展開還是折疊的目的了
6.引入方式
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示例
多級列表示例,如果覺得有用,還請點個贊。
打造RecyclerView的n級列表