关于三级菜单的实现方式

嵌入式存储进阶:除了KV存储,EasyFlash的IAP和LOG功能怎么玩? 本文深入探讨了嵌入式存储方案EasyFlash的高级功能,包括在线固件升级(IAP)和闪存日志存储(LOG)。通过详细解析IAP的双区备份设计和LOG的环形缓冲区架构,提供硬件适配、安全升级流程和日志管理技巧等实战指南,帮助开发者在物联网设备中实现可靠的数据存储和固件更新。 阅读详情

近日产品提出一个要一个三级菜单列表的功能,网上也一些资源,但是并不能满足需求。有4种实现思路:

(1)最常见的是两个expandlistview相互嵌套,亲身检测,比较繁琐,代码也不够简洁,而且会有三级惨淡测绘高度失效的情况.

(2)使用一个recycleview,自己来维护数据集合,亲测,这种方式两层的数据格式时,还是可以接受的,但是三层的时候,维护数据的复杂度就不是一个量级,比较复杂。

(3)使用3个recycleview嵌套,数据维持就相对简单,只要处理recycleview的测绘高度冲突即可,网上有很多,这里不多说。

(4)这是我实现的方式,自认为这种实现方式是比较简单且清晰的,两个控件嵌套,expandlistview和recycleview嵌套,童谣要处理好recycleview子类item项的高度测绘问题(这也是我的实现方式)

代码如下:

activity中的代码------------

public class MainActivity extends AppCompatActivity {


    private List<BeanData> mBeanDataList = new ArrayList<>();

    Context mContext;
    ExpandableListView mExpandableListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        initData();

        mExpandableListView = findViewById(R.id.expandableListView);
        mExpandableListView.setAdapter(new Myadapter(mContext, mBeanDataList));

    }

    /**
     * 初始化数据集合
     */
    private void initData() {
        for (int i = 0; i < 5; i++) {
            BeanData beanData = new BeanData();
            beanData.setContent("parent" + i);
            List<BeanData> beanDataList = new ArrayList<>();
            for (int j = 0; j < 5; j++) {
                BeanData beanData1 = new BeanData();
                beanData1.setContent("child" + j);
                List<BeanData> beanDataList1 = new ArrayList<>();
                for (int k = 0; k < 5; k++) {
                    BeanData beanData2 = new BeanData();
                    beanData2.setContent("secondChild" + k);
                    beanData2.setBeanData(new ArrayList<BeanData>());
                    beanDataList1.add(beanData2);
                }
                beanData1.setBeanData(beanDataList1);
                beanDataList.add(beanData1);
            }
            beanData.setBeanData(beanDataList);
            mBeanDataList.add(beanData);
        }
    }
}
布局的话就是一个expandlistview控件,就不贴了

一个实体类如下:

public class BeanData {

    private List<BeanData> mBeanData;
    private String content;

    public List<BeanData> getBeanData() {
        return mBeanData;
    }

    public void setBeanData(List<BeanData> beanData) {
        mBeanData = beanData;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
两个adapter  代码如下:

public class Myadapter extends BaseExpandableListAdapter {
    Context mContext;
    List<BeanData> list;

    public Myadapter(Context context, List<BeanData> list) {
        mContext = context;
        this.list = list;
    }

    @Override
    public int getGroupCount() {
        return list.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return list.get(groupPosition).getBeanData().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return list.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return list.get(groupPosition).getBeanData().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        parentViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.parent_item_layout, parent, false);
            holder = new parentViewHolder();
            holder.parent_tv = convertView.findViewById(R.id.partent);
            convertView.setTag(holder);
        } else {
            holder = (parentViewHolder) convertView.getTag();
        }

        holder.parent_tv.setText(list.get(groupPosition).getContent());

        return convertView;
    }

    class parentViewHolder {
        TextView parent_tv;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final childViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.child_item_layout, parent, false);
            holder = new childViewHolder();
            holder.child_tv = convertView.findViewById(R.id.partent1);
            holder.child_tv.setTag(false);
            holder.mAllHeightRecyclerView = convertView.findViewById(R.id.recyclerView);
            holder.mAllHeightRecyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext()));
            convertView.setTag(holder);
        } else {
            holder = (childViewHolder) convertView.getTag();
        }

        recyclerAdapter recyclerAdapter = new recyclerAdapter(list.get(groupPosition).getBeanData().get(childPosition).getBeanData());

        holder.mAllHeightRecyclerView.setAdapter(recyclerAdapter);

        holder.child_tv.setText(list.get(groupPosition).getBeanData().get(childPosition).getContent());

        holder.child_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isShow = (boolean) v.getTag();
                holder.mAllHeightRecyclerView.setVisibility(!isShow ? View.VISIBLE : View.GONE);
                v.setTag(!isShow);
            }
        });
        return convertView;
    }

    class childViewHolder {
        TextView child_tv;
        AllHeightRecyclerView mAllHeightRecyclerView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
}
    
public class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.RecyViewHolder> {

    private List<BeanData> mBeanDataList;

    private OnItemClickListener mOnItemClickListener;

    /**
     * Created by joker on 2018/1/10.
     */

    public interface OnItemClickListener {
        void onClick(int position, ShowData showData);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    public recyclerAdapter(List<BeanData> beanDataList) {
        mBeanDataList = beanDataList;
    }

    @Override
    public recyclerAdapter.RecyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        TextView textView = new TextView(parent.getContext());

        return new RecyViewHolder(textView);
    }

    @Override
    public void onBindViewHolder(recyclerAdapter.RecyViewHolder holder, int position) {
        holder.mTextView.setText(mBeanDataList.get(position).getContent());
    }

    @Override
    public int getItemCount() {
        return mBeanDataList.size();
    }

    class RecyViewHolder extends RecyclerView.ViewHolder {

        private TextView mTextView;
        RecyViewHolder(TextView itemView) {
            super(itemView);
            mTextView = itemView;
        }

    }
}

这里是一个强行测绘的recycleview:

/**
 * Created by jp on 2017/9/11.
 * 重新测量recyclerview高度,强制绘制全部高度
 */


public class AllHeightRecyclerView extends RecyclerView {

    public AllHeightRecyclerView(Context context) {
        super(context);
    }

    public AllHeightRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public AllHeightRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthSpec, expandSpec);
    }
}
三个列表布局中,需要注意的就是二级列表的布局了,代码如下:

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

    <TextView
        android:id="@+id/partent1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <com.joker.threelevelslist.AllHeightRecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"/>

</LinearLayout>
这个样完美完成三级列表的功能了


基于企业微信客服与GPT-3构建合规微信AI助手:从原理到部署实践 在人工智能与即时通讯融合的浪潮中,自然语言处理(NLP)与API集成成为构建智能对话系统的核心技术。其原理在于通过API网关接收用户输入,调用云端大语言模型进行处理,再将结果返回给用户,实现自动化交互。这项技术的核心价值在于将前沿AI能力无缝嵌入到日常高频应用场景中,极大地提升了客服自动化、智能问答与个性化服务的效率与体验。企业微信作为官方认可的企服平台,其开放的客服API接口为开发者提供了稳定、合规的消息通道,是连接微信生态与外部AI服务的理想桥梁。本文聚焦于如何利用企业微信客服API与OpenAI的GP 阅读详情

相关推荐

从CAD图纸到GIS地图:手把手教你用Global Mapper处理DWG文件(含坐标配准)

本文详细介绍了如何使用Global Mapper将CAD图纸(DWG文件)转换为GIS地图,包括坐标配准、图层与属性转换等关键步骤。通过四参数变换和控制点匹配技术,确保数据精准转换,适用于测绘、城市规划等领域。文章还提供了高级处理技巧和质量控制流程,帮助用户高效完成GIS化工作。

weixin_29196891的博客 522

css案例1——一级菜单、二级菜单、三级菜单、四级菜单

纯css实现二级菜单、三级菜单、四级菜单,代码易理解,上手操作快。

努力、拼搏、奋进 1万+

ros2 humble cartographer 2D激光雷达建图

Cartographer是一个支持多平台和传感器配置的SLAM的系统。 本文主要讲述在ros2 humble系统上cartographer的安装方法,以及如何配置参数实现自己的ros2 bag包的离线建图。

weixin_43087302的博客 6939

前端用显示隐藏样式实现三级菜单的效果(display实现)

style.border="0px solid #fff" (隐藏之后占位)(2).style.visibility="hidden" (隐藏之后占位)(1).style.display="none" (隐藏之后不占位)(3).style.opacity=0 (隐藏之后占位)

weixin_45096939的博客 719

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

西门子200SMART自定义库开发实战:从PID到露点算法的工业应用

本文详细介绍了西门子200SMART自定义库开发实战,涵盖从PID控制到露点算法的工业应用。通过代码封装技巧、多语言支持和性能优化等高级开发方法,帮助工程师提升PLC编程效率。文章特别强调了自创库在实际项目中的优势,如恒温恒湿控制系统的成功案例,展示了自定义库在工业自动化中的强大应用价值。

lake5的博客 1027

微服务商城系统实战 后台管理页面、商家管理页面、商品列表跳转详情页

文章目录一、后台管理1、解决 height: 100% 不起作用问题 一、后台管理 采用左边栏多级菜单的形式,前端页面如下: 1、解决 height: 100% 不起作用问题 注意到左边栏的高度并没有充满页面,需要调整一下:     只将此处的 height 改成 100%,是不会奏效的,因为 Web 浏览器在计算有效宽度时会考虑浏览器窗口的打开度。如果不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度。   但是高度的计算方式完全不一

weixin_41750142的博客 3412

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2197

三级菜单页面布局_三级菜单的最快导航布局

三级菜单页面布局 重点 (Top highlight)When users navigate an interface, there’s a need for speed. The faster it is for them to find what they’re looking for, the more time they’ll save on their task. 用户导航界面时,需要提...

weixin_26732881的博客 2941

IC 笔试真题之吾见——华为实习(1)

前言 今天(2022 04 07)刚建立了一个专栏《IC真题之吾见》,准备记录一些IC真题的见解,为以后找工作做一点准备。 刷题绝不是目的,以题代练,以题代学。 题目来自师兄申请 华为实习“设计”岗位 的笔试真题。 见解大部分来自自己学习的理解,也有部分超纲知识是网络检索得到,希望可以多多在评论区留言交流,共同进步! 有问题的地方也希望可以直接批评指正! 后面也会同步更新此专栏! 1、下列有关时序分析的描述正确的是() A. recovery时间,是指异步控制信号在有效时钟沿到达之后必须保持

记录所学,分享知识,结识挚友 8637

跨平台C#上位机开发:.NET MAUI与工业物联网的融合实战

NET MAUI正在重塑工业上位机的开发模式——从“为单一设备定制”转向“全场景覆盖”。其价值不仅在于“代码复用”,更在于打通了工业物联网的“最后一公里”:让边缘设备、云平台、移动终端通过统一的数据模型协同工作。未来,随着.NET MAUI对WebAssembly的支持(计划在.NET 9实现),上位机甚至可直接运行在浏览器中,进一步降低部署门槛。对于工业开发者,掌握跨平台技术意味着能更快响应多样化的现场需求,从“Windows专家”升级为“全栈工业开发者”。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1091

使用listview实现简单的三级地址联动选择器

近期项目中将要使用到地址联动选择器,就想自己用listview去简单实现一下功能,然后写了一个小demo。效果如下: 其实原理非常简单,就是对listview的滑动监听。然后做响应的操作就行了。 首先我们看看xml文件,简单的三个listview:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="h

iiccer的博客 1650

Centos7系统添加中文支持(附中文语言包)

这里以centos7.6为例,在安装系统是没有选择中文,之后如果需要添加中文支持。在命令行执行后,会提示启动图形模式失败,转为启动文本模式。文本模式其实和图形模式差不多,操作需要用键盘而不是鼠标。在弹窗后,通过上下键选择Chinese(P.R of China) - 中文(简体):然后,按Tab键选择Yes,点击回车。rebootlocale可以看到系统语言已经变成了zh_CN.utf-8:之后,服务器上的中文名称就可以正常显示正常了。

悦分享 683

三级菜单的实现方式

实现要求: 三级菜单 可依次选择进入各子菜单 所需知识点:列表、字典 1 #!/usr/local/env python3 2 # -*- coding:utf-8 -*- 3 ''' 4 Author:@Alvin Lv 5 Blog:http://www.cnblogs.com/Xiaolong-Lv/ 6 E-mail:lxtxlxl@163.c...

weixin_30488085的博客 95

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

三级菜单的其他实现方式

zTree v3.5 Demo http://www.treejs.cn/v3/demo.php#_101

岁月不中留,可堪回首否? 450

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

vue+element使用动态加载路由方式实现三级菜单页面显示问题

需要用到中间件的方式,这样就可以实现了我们想要的方式publish-center.vue&lt;template&gt; &lt;router-view&gt;&lt;/router-view&gt; &lt;/template&gt; &lt;script&gt; export default { } &lt;/script&gt; &lt;el-menu :defa...

qq_14926871的博客 2万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

vue三级菜单渲染_vue+element UI递归方式实现多级导航菜单

介绍这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能。使用方法由于该组件是基于element-UI进行二次封装的,所以在使用该组件时请务必安装element-UI(安装方式猛戳这里),安装好element-UI后,只需将该组件文件夹SideBar导入到现有项目中即可使用。工作...

weixin_35544325的博客 1760

三级菜单

menu = { '大一':{ '学科':{ 'c语言':{}, '物联网概论':{}, '初识python': {}, '操作系统':{} }, '娱乐':{ '运动会':{}, ...

weixin_30375427的博客 131

python中三级菜单讲解_Python进阶实战之三级菜单

一、Python进阶实战之三级菜单打印省、市、县三级菜单可返回上一级可随时退出程序1.1 面条版menu = {'北京': {'海淀': {'五道口': {'soho': {},'网易': {},'google': {}},'中关村': {'爱奇艺': {},'汽车之家': {},'youku': {},},'上地': {'百度': {},},},'昌平': {'沙河': {'老男孩': {},'...

weixin_39860975的博客 280

vue三级菜单渲染_vue实现三级菜单循环展示效果

涉及技术栈layui+bootstrap + vue ,项目布局时请引入相应库文件。源码获取:关注公众号 扣丁曼 回复 vue菜单 获取源代码。1、效果图展示效果图2、项目代码顶部分类栏代码系统院感办公质控病案页面展示li列表(左侧菜单栏)高级后台系统{{v.name}}{{vv.name}}页面js代码(vue部分)var vm = new Vue({el: '#LAY_app',data: {...

weixin_39623050的博客 899

python打怪之路【第三篇】:利用Python实现三级菜单

程序:利用Python实现三级菜单 要求:   打印省、市、县三级菜单   可返回上一级   可随时退出程序 coding: menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, ...

weixin_30640769的博客 108

Axure中继器实现三级菜单

在日常产品设计中,我们时常会使用到系统一级、二级、三级菜单等,那除了传统的动态面板设计菜单、矩形直接设计,有什么更便捷的方式吗,那就是用中继器实现三级菜单,下面我们一起来看看如何实现。Axure Design 高保真原型设计欢迎您,本站提供Axure多种动态交互元件库以及原型模板、高效便捷,提高设计效率。Axure Design 高保真原型设计欢迎您,本站提供Axure多种动态交互元件库以及原型模板、高效便捷,提高设计效率。步骤1:页面中拖入一个中继器,中继器中放三个元件,分别为图片、矩形、箭头图片。

weixin_44933101的博客 2481

el-dropdown组件实现三级菜单

el-dropdown组件实现三级菜单 一级菜单点击触发,二级、三级hover触发 <el-dropdown trigger="click"> <span class="el-dropdown-link"> 下拉菜单<i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown">

kaiup的博客 4827

python学习之路 三级菜单的实现

三级菜单实现的几种方式 普通的写法 name = { '北京': { '朝阳区': { '望京': ['cc', '大众'], '国贸': ['宝马', '奔驰'], '东直门': ['保洁', '业务'], }, '海淀区': { ...

weixin_30888707的博客 103

【Python实战】实现三级菜单

1. 项目需求 打印省、市、县三级菜单 可返回上一级 可随时退出程序 提示所需知识:列表、字典 2. 代码实例 2.1. 简单除暴版 menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': {

运维技术博客 1294

Android UI设计和形成原理(实现三级菜单)

本次要实现的是动态编码之三级菜单的实现,在实际应用开发中经常会使用到三级菜单,比如商城项目中的省市区,分类等等。 问题:界面加载是一次性new 大量的控件还是先加载一级菜单,点击一级菜单加载他对应的二级菜单 答:这个很明显是后者更符合开发思维,因为客户不可能每个级别都一一点开,能点开所有级别的只有万恶的测试人员。 界面加载方案: 1.数据进行一次性加载(一次把服务端传递过来的数据解析封装到

LUFANZHENG的专栏 3956
上一篇: 关于视频播放横竖屏切换不再重复oncreat函数
下一篇: jvm和dvm
jipengandroid
博客等级 码龄10年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值