Android中的二级列表-ExpandableListView

Android中的二级下拉列表,类似于某Q的分组,采用ExpandableListView实现,适配器方法如下。

先看效果图:有四个分组,每个分组下都有一些子条目,可以跟着父条目展开而显示

 实现代码:

一级列表是一个ArrayList,二级列表是一个HashMap。

    <ExpandableListViewandroid:id="@+id/expandableListView"android:layout_width="match_parent"android:layout_height="wrap_content"android:nestedScrollingEnabled="false"android:layout_weight="1"/>
     //添加一级数据项 存储一级菜单的名字ArrayList<String> firstLevelMenuList = SeatModelManager.getInstance().getTxGroups();//二级数据LinkedHashMap<String, List<String>> secondItems = new LinkedHashMap<>();ArrayList<String> txNameList;for (int i = 0; i < firstLevelMenuList.size(); i++) {ArrayList<Tx> txes = SeatModelManager.getInstance().readTxByGroup(firstLevelMenuList.get(i));txNameList = new ArrayList<>();for (int j = 0; j < txes.size(); j++) {//根据一级菜单的名字匹配自己所在的父条目if (txes.get(j).getGroup().equals(firstLevelMenuList.get(i))) {txNameList.add(txes.get(j).getTxName());}}secondItems.put(firstLevelMenuList.get(i), txNameList);}expandableListView = inflate.findViewById(R.id.expandableListView);expandableListAdapter = new ExpandableListviewAdapter(getActivity(), firstLevelMenuList, secondItems);expandableListView.setAdapter(expandableListAdapter);

适配器,构造方法里的代码根据需要进行编写

public class ExpandableListviewAdapter extends BaseExpandableListAdapter {private static final String TAG = "ExpandableListviewAdapt";private ArrayList<String> firstItems;private Map<String, List<String>> secondItems;private Map<String, boolean[]> secondItemSelection;//记录子条目选中状态private List<String> selectChildItems;//记录子条目的顺序public ExpandableListviewAdapter(Context context, ArrayList<String> firstItems, Map<String, List<String>> secondItems) {this.context = context;this.firstItems = firstItems;this.secondItems = secondItems;secondItemSelection = new HashMap<>();selectChildItems = new ArrayList<>();//初始化子条目中的顺序列表//初始化子条目的选中状态for (String first : firstItems) {int secondCunt = secondItems.get(first).size();boolean[] selection = new boolean[secondCunt];secondItemSelection.put(first, selection);}}//返回当前被选中的子条目的数据public ArrayList<String> getSelectChildItems() {ArrayList<String> selectItems = new ArrayList<>();for (String firstItem : firstItems) {boolean[] selection = secondItemSelection.get(firstItem);List<String> second = secondItems.get(firstItem);for (int i = 0; i < selection.length; i++) {if (selection[i]) {selectItems.add(second.get(i));}}}//创建新的列表 按照顺序添加子条目ArrayList<String> selectItemsInOrder = new ArrayList<>();for (String item : selectChildItems) {if (selectItems.contains(item)) {selectItemsInOrder.add(item);}}return selectItemsInOrder;}@Overridepublic int getGroupCount() {return firstItems.size();}@Overridepublic int getChildrenCount(int groupPosition) {String s = firstItems.get(groupPosition);List<String> strings = secondItems.get(s);return strings != null ? strings.size() : 0;}@Overridepublic Object getGroup(int groupPosition) {return firstItems.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return secondItems.get(groupPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {GroupViewHolder groupViewHolder;if (convertView == null) {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView = inflater.inflate(R.layout.item_parent, null);groupViewHolder = new GroupViewHolder();groupViewHolder.parentTv = convertView.findViewById(R.id.item_parent_tv);groupViewHolder.parentTv.setText(firstItems.get(groupPosition));convertView.setTag(groupViewHolder);}return convertView;}TextView childNum;@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {if (convertView == null) {LayoutInflater inflater = LayoutInflater.from(parent.getContext());convertView = inflater.inflate(R.layout.item_child, parent, false);}//设置子布局String firstItem = firstItems.get(groupPosition);boolean[] selection = secondItemSelection.get(firstItem);boolean isSelect = selection[childPosition];String secondItem = secondItems.get(firstItem).get(childPosition);TextView childText = convertView.findViewById(R.id.item_child_tv);CheckBox childCb = convertView.findViewById(R.id.item_child_cb);childNum = convertView.findViewById(R.id.item_num);childText.setText(secondItem);childCb.setChecked(isSelect);//获取当前子条目在列表中的位置int index = getChildIndex(groupPosition, childPosition);if (index > 0) {childNum.setText(String.valueOf(index));//设置数字角标childNum.setVisibility(View.VISIBLE);childCb.setChecked(true);} else {childNum.setVisibility(View.INVISIBLE);childCb.setChecked(false);}//复选框的监听事件childCb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {boolean isChecked = childCb.isChecked();selection[childPosition] = isChecked;//处理选中的状态逻辑if (isChecked) {String childItem = secondItems.get(firstItem).get(childPosition);selectChildItems.add(childItem);} else {//子条目取消选中 移除选中的子条目String childItem = secondItems.get(firstItem).get(childPosition);selectChildItems.remove(childItem);}notifyDataSetChanged();List<String> selectChildItems = getSelectChildItems();Log.d(TAG, "getGroupView: " + selectChildItems);}});return convertView;}/*** 获取子条目在列表中的位置** @param groupPosition* @param childPosition* @return*/private int getChildIndex(int groupPosition, int childPosition) {String firstItem = firstItems.get(groupPosition);String secondItem = secondItems.get(firstItem).get(childPosition);int index = selectChildItems.indexOf(secondItem);// 由于索引从0开始,所以需要加1return index + 1;}public void setSelectChildItems(ArrayList<String> selectChildItems) {this.selectChildItems = selectChildItems;
//        for (int i = 0; i < selectChildItems.size(); i++) {
//            String s = selectChildItems.get(i);
//            for (String second : selectChildItems)
//                if (s.equals(second)) {
//
//                }
//        }notifyDataSetChanged();//更新页面显示}//指定位置上的子元素是否可选中@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}//刷新子条目数据public void updateChildData(int groupPosition, List<String> childList) {notifyDataSetChanged();}public void updateChildView() {notifyDataSetChanged();}static class GroupViewHolder {TextView parentTv;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70566.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

avue 时间选择器限制时间范围(当天以后的时间、当前月、当前月剩余时间)

时间选择器做项目时必不可少的组件&#xff0c; 今天就简单举几个常用的例子供参考。 <avue-form v-model"form" :option"option"></avue-form><script> export default {data() {return {form:{},option:{column: [{label: "禁止日…

HTML5 游戏开发实战 | 五子棋

01、五子棋游戏设计的思路 在下棋过程中&#xff0c;为了保存下过的棋子的信息&#xff0c;使用数组 chessData。chessData&#xff3b;x&#xff3d;&#xff3b;y&#xff3d;存储棋盘(x&#xff0c;y)处棋子信息&#xff0c;1 代表黑子&#xff0c;2 代表白子&#xff0c;0…

嵌入式编译FFmpeg6.0版本并且组合x264

下载直通车:我用的是6.0版本的 1.准备编译: 2.进入ffmpeg源码目录&#xff0c;修改Makefile&#xff0c;添加编译选项&#xff1a; CFLAGS -fPIC 不加会报错 3.使用命令直接编译 ./configure --cross-prefix/home/xxx/bin/arm-linux-gnueabihf- --enable-cross-compile --targ…

Kafka-eagle监控平台

Kafka-Eagle简介 在开发工作中&#xff0c;当业务不复杂时&#xff0c;可以使用Kafka命令来进行一些集群的管理工作。但如果业务变得复杂&#xff0c;例如&#xff1a;需要增加group、topic分区&#xff0c;此时&#xff0c;再使用命令行就感觉很不方便&#xff0c;此时&#x…

Spark SQL优化:NOT IN子查询优化解决

背景 有如下的数据查询场景。 SELECT a,b,c,d,e,f FROM xxx.BBBB WHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} AND predict_type not IN ( SELECT distinct a FROM xxx.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通过查看SQL语句的执行计划基本…

RunnerGo链接数据库功能详解

我们在做性能测试或者场景测试时往往需要从数据库中获取一些真实的系统数据让我们配置的场景更加贴合实际。而RunnerGo也是在最近的大版本更新中推出连接数据库功能&#xff0c;本篇文章也给大家讲解一下具体的操作方法和实际应用场景。 配置数据库 首先进入RunnerGo页面&…

【word密码】word怎么限制格式,但可以修改文字?

想要限制word文件中文字的格式&#xff0c;但是又希望别人能够删除、输入文字&#xff0c;想要实现这种设置我们可以对word文件设置限制编辑。 点击word文件工具栏中的审阅 – 限制编辑&#xff0c;勾选上【限制对选定的样式设置格式】 然后在弹出的提示框中&#xff0c;输入我…

四川玖璨电商:新媒体短视频运营是做什么?

随着互联网科技的不断发展&#xff0c;新媒体行业如今已经成为了人们获取信息、进行交流的主要渠道之一。在这样的大环境下&#xff0c;短视频成为了新媒体运营的一个重要组成部分。那么&#xff0c;新媒体短视频运营到底是做什么呢&#xff1f;接下来&#xff0c;小编将从几个…

机器学习|Softmax 回归的数学理解及代码解析

机器学习&#xff5c;Softmax 回归的数学理解及代码解析 Softmax 回归是一种常用的多类别分类算法&#xff0c;适用于将输入向量映射到多个类别的概率分布。在本文中&#xff0c;我们将深入探讨 Softmax 回归的数学原理&#xff0c;并提供 Python 示例代码帮助读者更好地理解和…

3D模型格式转换工具如何与Parasolid集成?

概述 HOOPS Exchange包括一个 Parasolid 连接器&#xff0c;它允许 Parasolid 开发人员轻松地将 CAD 数据导入到活动的 Parasolid 会话中。如果源数据基于 Parasolid&#xff08;NX、Solid Edge 或 SolidWorks&#xff09;&#xff0c;则数据将按原样导入。 这意味着您可以假…

应用在汽车前照灯系统中的环境光传感芯片

为了保证行车照明的安全性和方便性&#xff0c;减轻驾驶员的劳动强度。近年来&#xff0c;出现了许多新的照明控制系统&#xff0c;例如用于日间驾驶的自动照明系统、光束调节系统、延迟控制等。尤其是汽车自适应前照灯系统&#xff0c;它是一种能够自动改变两种以上的光型以适…

网络通信原理IP头部格式(第四十二课)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部长度: 次数据包的首部长度一共是多少,没有加可选项3)优先级与服务类型:表示****数据包是否需要优选传递4)总长度: 表示的是整个数据包的大小,也就****是首部+数据5)标识符、标志、段偏移量:的作用将拆开的…