利用BaseMultiItemQuickAdapter打造二、三级级菜单

2023-11-16

去网上找了下资料,然后自己整理了下二级、三级菜单的实现,直接上代码。

  Recyclerview记得要导包:implementation 'com.android.support:recyclerview-v7:28.0.0'

一、首先在app下的build.gradle中加入:

//适配器
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.6.1'

二、在project下的build.gradle中加入:

maven { url 'https://jitpack.io' }
如图:

三、建立三个bean类并实现MultiItemEntity

public class ExpandItem extends AbstractExpandableItem<Expand1Item> implements MultiItemEntity {

    private String title;

    public ExpandItem(String title) {
        this.title = title;
    }

    @Override
    public int getLevel() {
        return 0;
    }

    @Override
    public int getItemType() {
        return QuickExpandableAdapter.TYPE_LEVEL_0;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
public class Expand1Item extends AbstractExpandableItem<Expand2Item> implements MultiItemEntity {

    private String title;

    public Expand1Item(String title){
        this.title = title;
    }

    @Override
    public int getLevel() {
        return 1;
    }

    @Override
    public int getItemType() {
        return QuickExpandableAdapter.TYPE_LEVEL_1;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
public class Expand2Item implements MultiItemEntity {

    private String title;

    public Expand2Item(String title) {
        this.title = title;
    }

    @Override
    public int getItemType() {
        return QuickExpandableAdapter.TYPE_LEVEL_2;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

四、建立QuickExpandableAdapter

public class QuickExpandableAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {

    public static final int TYPE_LEVEL_0 = 0;
    public static final int TYPE_LEVEL_1 = 1;
    public static final int TYPE_LEVEL_2 = 2;

    /**
     *     * Same as QuickAdapter#QuickAdapter(Context,int) but with
     *     * some initialization data.
     *     *
     *     * @param data A new list is created out of this one to avoid mutable list
     *    
     */
    public QuickExpandableAdapter(List<MultiItemEntity> data) {
        super(data);
        addItemType(TYPE_LEVEL_0, R.layout.view_expand_0);
        addItemType(TYPE_LEVEL_1, R.layout.view_expand_1);
        addItemType(TYPE_LEVEL_2, R.layout.view_expand_2);
    }

    @Override
    protected void convert(final BaseViewHolder helper, MultiItemEntity item) {
        switch (helper.getItemViewType()) {
            case TYPE_LEVEL_0:
                final ExpandItem item0 = (ExpandItem) item;
                helper.setText(R.id.expand_list_item0_tv, item0.getTitle());
                helper.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = helper.getAdapterPosition();
                        if (item0.isExpanded()) {
                            collapse(pos);
                            Toast.makeText(mContext, "收起:" + item0.getTitle(), Toast.LENGTH_SHORT).show();
                        } else {
                            expand(pos);
                            Toast.makeText(mContext, "展开:" + item0.getTitle(), Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                break;
            case TYPE_LEVEL_1:
                final Expand1Item item1 = (Expand1Item) item;
                helper.setText(R.id.expand_list_item1_tv, item1.getTitle());
                helper.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = helper.getAdapterPosition();
                        if (item1.isExpanded()) {
                            collapse(pos, false);
                            Toast.makeText(mContext, "收起:" + item1.getTitle(), Toast.LENGTH_SHORT).show();
                        } else {
                            expand(pos, false);
                            Toast.makeText(mContext, "展开:" + item1.getTitle(), Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                break;
            case TYPE_LEVEL_2:
                final Expand2Item item2 = (Expand2Item) item;
                helper.setText(R.id.expand_list_item2_tv, item2.getTitle());
                helper.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(mContext, "点击:" + item2.getTitle(), Toast.LENGTH_SHORT).show();
                    }
                });
                break;
        }
    }
}

五、主界面代码

public class ListActivity extends AppCompatActivity {
    private QuickExpandableAdapter expandableAdapter;
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //设置布局管理器
        recyclerView.setLayoutManager(layoutManager);
        //设置为垂直布局,这也是默认的
        layoutManager.setOrientation(OrientationHelper.VERTICAL);

        //设置增加或删除条目的动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        expandableAdapter = new QuickExpandableAdapter(getExpandListData(10));
        expandableAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_RIGHT);
        recyclerView.setAdapter(expandableAdapter);

        expandableAdapter.expandAll(0, true);

    }

    private List<MultiItemEntity> getExpandListData(int count) {
        int lvCount = count;
        int lv1Count = 3;
        int lv2Count = 5;

        List<MultiItemEntity> data = new ArrayList<>();
        for (int i = 0; i < lvCount; i++) {
            ExpandItem item0 = new ExpandItem("一级列表标题" + i);
            for (int j = 0; j < lv1Count; j++) {
                Expand1Item item1 = new Expand1Item("二级列表标题" + j);
                for (int k = 0; k < lv2Count; k++) {
                    item1.addSubItem(new Expand2Item("三级列表标题" + k));
                }
                item0.addSubItem(item1);
            }
            data.add(item0);
        }

        return data;
    }
}

六、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/expand_list_item0_tv"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center_vertical"
        android:text="一级菜单"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/expand_list_item1_tv"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center_vertical"
        android:text="二级菜单"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/expand_list_item2_tv"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center_vertical"
        android:text="三级菜单"/>
</LinearLayout>

好了,到这里代码已经全部写完了,因为很简单,所以就写的粗糙了些,拿上能直接用。

这里有个问题:

         1.是和我做的项目有关联,如果你的recycleView外面嵌套了NestedScrollView的话,数据量一大就会导致你的列表好卡,我表示深受其害,这是因为你嵌套了NestedScrollView后,会把recyclerview所有的条目都加载出来,相当于吧recycleView的复用机制给禁掉。想想多可怕~~~

         2.用ScrollView虽然可以复用,但是又会与recyclerview有滑动冲突,所以最好是不要嵌套,要不然又要解决冲突。

  因为我之前解决NestedScrollView和Recyclerview的冲突就是禁掉了Recyclerview的滑动事件,只用外层NestedScrollView的滑动事件,所以最后坑了自己一把。。。。。。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用BaseMultiItemQuickAdapter打造二、三级级菜单 的相关文章

随机推荐

  • 华为云技术开放日(第三季)活动报道

    智能共生 链接未来 华为云技术开放日 第三季 精彩回顾 7 月 29日 8 月 12 日 由华为云与中生代技术社区联合主办的华为云技术开放日 第三季 圆满落下帷幕 本次技术开放日邀请了华为云 MVP 李弋凡 华为公司5G产品线首席架构师廖尔
  • 虚函数与虚函数表

    虚函数与虚函数表 一 概述 为了实现C 的多态 C 使用了一种动态绑定的技术 这个技术的核心是虚函数表 下文简称虚表 本文介绍虚函数表是如何实现动态绑定的 二 类的虚表 每个包含了虚函数的类都包含一个虚表 我们知道 当一个类 A 继承另一个
  • LeetCode 189. 轮转数组

    前言 Wassup guys 我是Edison 今天是 LeetCode 上的 leetcode 189 轮转数组 Let s get it 文章目录 1 题目分析 2 题目图解 思路一 右旋 k 次 依次移动一个 思路二 额外开数组 思路
  • 【学习笔记之操作系统原理篇】进程管理

    进程的概念 进程 单道程序 特点 顺序性 封闭性 独占性 可再现性 多道程序系统 特点 间断性 相互制约竞争资源 失去封闭性 共性资源 多个程序操作相同资源 不可再现性 运行结果不唯一 因为执行顺序不唯一 进程特征 动态性 一个进程可以对应
  • 写博客有哪些好用的工具和软件?

    写博客有哪些好用的工具和软件 在各种平台上写文章 要有一个好用的编辑器 使用简单方便 不用花很多时间排版 能预览效果等 此外 文章还需要配图片 动图和视频等 所以需要好用的截图软件 视频录制和剪辑软件 本文介绍我自己使用的软件和工具 本人认
  • mysql 重复下单_你的项目是如何处理重复请求/并发请求的?

    你的项目是如何处理重复请求 并发请求的 对于一些用户请求 在某些情况下是可能重复发送的 如果是查询类操作并无大碍 但其中有些是涉及写入操作的 一旦重复了 可能会导致很严重的后果 例如交易的接口如果重复请求可能会重复下单 重复的场景有可能是
  • GD32,在电源电路VDD VDDA VREF+/-参考设计

    GD32 在电源电路参考设计 https bbs 21ic com icview 2568876 1 9 html 资料来源于微信公众号 life and family 更多相关资料可以关注下该公众号 对于GD32 在电源电路设计方面的一些
  • C语言中volatile关键字,简单说明

    C语言中volatile关键字 如 define GPIO1 DR volatile unsigned int 0x0209C000 数据寄存器 每一位代表一个GPIO的0或1 一句话 使用volatile修饰后 会强制你每次引用GPIO寄
  • epoll移植到windows的可行性研究

    1 各有千秋 linux作为高效稳定的操作系统 部署在大量的服务器上 epoll在linux下 一个高性能的网络IO模型 在服务端领域发挥着重要的作用 但在开发效率上 windows以及visual studio系列因其良好的用户体验而更受
  • rabbitmq 添加用户和设置最大权限,也是解决mq报socket关闭异常

    此方式也是解决整合mq后 自己添加用户后 mq报socket关闭异常 1 安装完可视化mq后台后 直接http localhost 15672 进入 2 默认帐号密码 guest guest 3 首先添加用户 tags设置为admin 最大
  • OpenGL纹理贴图相关基本概念

    1 纹理贴图之所以复杂是因为矩形的纹理数据需要被合理地映射到非矩形的区域上面 纹理就是数据的数组 例如颜色数据亮度数据alpha数据等 纹理的单个数据值 被叫做纹理元素 英文叫做texual 初学者会本能地把纹理当成二维图像 但是纹理也可以
  • JavaScript的外部引入方式

    document writeln hello world
  • 聊聊数据库中的 savepoint

    从全局二级索引讲起 故事要从全局二级索引开始讲起 当我们构建了一个全局二级索引之后 一条逻辑上的数据插入 就会变成两条物理上的数据插入 一条插入到主表 另一条插入到索引表 为了保证主表和索引表数据的一致性 我们往往需要开启分布式事务 再并行
  • keil5 Device Database 灰色问题

    使用 keil5 安装 GD 软件包后打开工程依然无法搜索到对应的芯片型号 GD32F450 The Project references device files or libraries that are not installed D
  • 一个类的实例是另一个类的属性python_Python 的类其实是一个特殊的对象

    Python 中的类是一个特殊的对象 Python 中一切皆对象 class AAA 定义的类属于类对象 obj1 AAA 属于实例对象 在程序运行时 类同样会被加载到内存 类是一个特殊的对象 类对象 类对象在内存中只有一份 使用一个类可以
  • 60-200-072-使用-命令-MySQL使用mysqldumpslow分析慢查询日志文件

    1 概述 因为直接分析日志文件是个体力活 因此mysql为我们提供了相关工具mysqldumpslow来对慢查询日志文件进行分析 2 mysqldumpslow命令 访问次数最多的10条sql语句 usr local mysql bin m
  • fedora18 从文本模式启动而不是图形界面启动

    在之前的linux版本中 如果想要启动操作系统后直接进入文本模式 那就要修改 etc inittab这个文件 把其中的5改成3即可 可是 linux2 6 貌似是 内核之后 这个文件就改了 它不再控制着系统的默认启动模式了 如果在fedor
  • vant-weapp 组件 样式的覆盖(一)

    最近在小程序开发中使用到 vant weapp 组件 但有些样式不符合自己的项目要求 需要对样式进行覆盖 以DropdownMenu组件为例 需求是用户选择菜单项 菜单文字变成 橙色 样式的修改 就是以权重高的 覆盖权重低的
  • “Docker Content Trust + 镜像签名”,打造安全的 Kubernetes 供应链!

    出品丨Docker公司 ID docker cn 编译丨小东 每周一 三 五晚6点10分 与您不见不散 说在前面 两周前 我们分享了一篇名为 镜像扫描 基于策略的镜像提升 打造安全的 Kubernetes 供应链 的文章 它主要介绍了 Do
  • 利用BaseMultiItemQuickAdapter打造二、三级级菜单

    去网上找了下资料 然后自己整理了下二级 三级菜单的实现 直接上代码 Recyclerview记得要导包 implementation com android support recyclerview v7 28 0 0 一 首先在app下的