打造RecyclerView的n級列表

先上效果圖:
git

1.該多級列表的優點:

  1. 支持無限級列表展開
  2. 基於一個recyclerView實現
  3. 能夠自定義每一級item的樣式,定製化更強

2.設計的思路

  1. 數據結構List<ItemBean>,ItemBean類中有變量List<ItemBean>,構造總體RecyclerView的數據源
  2. 由於RecyclerView.Adapter原本就支持多個type的item佈局,不清楚的能夠看下getItemViewType這個方法,因此咱們能夠利用這個類,來區分不一樣級用不一樣的Item。
  3. 將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個數,會根據是否展開的狀態來統總個數github

註釋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:
            ......
        }
    }
}
  1. 上面的泛型T就是咱們的Item的class類型,因此自定義的class要想用這個adapter的話,都須要實現Tree接口
  2. onBindViewHolder方法中形參的的type就是層級,好比說第一級type就是0,第二級是1,以此類推

5.另外自定義的類若是不須要extends的話,那麼須要繼承wellijohn.org.treerecyclerview.vo.TreeItem,若是已經寫了的話,那麼就須要本身實現Tree接口。

必須實現的幾個方法:maven

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示例

多級列表示例,若是以爲有用,還請點個贊。ide

相關文章
相關標籤/搜索