资讯专栏INFORMATION COLUMN

打造RecyclerView的n级列表

Baoyuan / 2689人阅读

摘要:先上效果图该多级列表的优势支持无限级列表展开基于一个实现可以自定义每一级的样式,定制化更强设计的思路数据结构类中有变量构造整体的数据源因为本来就支持多个的布局,不清楚的可以看下这个方法,所以我们可以利用这个类,来区分不同级用不同的。

先上效果图:

1.该多级列表的优势:

支持无限级列表展开

基于一个recyclerView实现

可以自定义每一级item的样式,定制化更强

2.设计的思路

数据结构List,ItemBean类中有变量List,构造整体RecyclerView的数据源

因为RecyclerView.Adapter本来就支持多个type的item布局,不清楚的可以看下getItemViewType这个方法,所以我们可以利用这个类,来区分不同级用不同的Item。

将Item必须具备的方法放在一个Tree接口里面,以后自定义的类只需要继承Tree接口就好了。

3.代码分析
public abstract class BaseTreeRVAdapter extends 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:主要是计算当前给的数据他的item个数,会根据是否展开的状态来统总个数

注释2:计算当前的postion对应的item层级,来显示对应的item布局

4.对于自己需要实现的地方
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要想用这个adapter的话,都需要实现Tree接口

onBindViewHolder方法中形参的的type就是层级,比如说第一级type就是0,第二级是1,以此类推

5.另外自定义的类如果不需要extends的话,那么需要继承wellijohn.org.treerecyclerview.vo.TreeItem,如果已经写了的话,那么就需要自己实现Tree接口。

必须实现的几个方法:

    int getLevel();//每个item的层级,比如一级就是0,二级就返回1,这里的0和1可以自己定义,后面就是根据这个来选择哪种样式的item

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

多级列表示例,如果觉得有用,还请点个赞。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76800.html

相关文章

  • 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存

    摘要:数据源频繁更新的场景,如弹幕等的优势会非常明显进一步来讲,结论是列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用,更加强大完善,易扩展其它情况如微信卡包列表页两者都,但在使用上会更加方便,快捷。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerV...

    wangzy2019 评论0 收藏0

发表评论

0条评论

Baoyuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<