当前位置: 首页 > news >正文

打造RecyclerView的n级列表

先上效果图:

1.该多级列表的优势:

  1. 支持无限级列表展开
  2. 基于一个recyclerView实现
  3. 可以自定义每一级item的样式,定制化更强

2.设计的思路

  1. 数据结构List,ItemBean类中有变量List,构造整体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个数,会根据是否展开的状态来统总个数

注释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接口。

必须实现的几个方法:

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

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

相关文章:

  • python之异常处理模块
  • 微服务通信策略
  • 《Python从小白到大牛》第9章 数据结构
  • 写给33岁的自己:为之奋斗一生的事业
  • ElasticSearch6.3.2------入门
  • 技术团队
  • 阿里云表格存储使用教程
  • ROS设备的性价比图
  • jQuery跳转到页面指定位置
  • PMP每日一题
  • TimesTen数据库的备份和恢复
  • ARMS V2.4.4 发布,自定义监控商业化发布
  • ElasticSearch 全文检索— ElasticSearch 核心概念
  • 什么是ground truth(GT)
  • 深入理解JUnit 5的扩展模型
  • 2017-09-12 前端日报
  • Android单元测试 - 几个重要问题
  •  D - 粉碎叛乱F - 其他起义
  • js ES6 求数组的交集,并集,还有差集
  • Python - 闭包Closure
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python大佬养成计划----difflib模块
  • react 代码优化(一) ——事件处理
  • spring security oauth2 password授权模式
  • Vultr 教程目录
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 排序算法学习笔记
  • 使用 QuickBI 搭建酷炫可视化分析
  • 问题之ssh中Host key verification failed的解决
  • 运行时添加log4j2的appender
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​插件化DPI在商用WIFI中的价值
  • # centos7下FFmpeg环境部署记录
  • (09)Hive——CTE 公共表达式
  • (3)(3.5) 遥测无线电区域条例
  • (Java)【深基9.例1】选举学生会
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (多级缓存)缓存同步
  • (二)换源+apt-get基础配置+搜狗拼音
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)http协议
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .naturalWidth 和naturalHeight属性,
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net 发送邮件
  • .netcore如何运行环境安装到Linux服务器
  • .Net多线程总结
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET下的多线程编程—1-线程机制概述
  • /dev下添加设备节点的方法步骤(通过device_create)
  • :“Failed to access IIS metabase”解决方法
  • @angular/cli项目构建--Dynamic.Form
  • @property括号内属性讲解