ExpandableListView详解

article/2025/9/26 15:43:55

文章目录

  • 效果图
  • ExpandableListView的简介与使用
  • 去掉ExpandableListView的箭头以及自定义Indicator
  • 解决setOnChildClickListener失效问题
  • 解决collapseGroup(i)崩溃问题
  • 解决group_item.xml中包含CheckBox、EditText等,点击不能展开的问题

1.效果图
这里写图片描述


2.ExpandableListView的简介与使用
ExpandableListVivew是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里 又可包含多个列表项。ExpandableListVivew的用法与普通ListView的用法非常相似,只是ExpandableListVivew 显示的列表项应该由ExpandableAdapter提供。

  • 重要方法
//在分组列表中展开指定组(若想全部展开,循环分组列表再调用此方法)
expandGroup (int groupPos) ;
//在分组列表中关闭指定组(若想全部展开,循环分组列表再调用此方法)
collapseGroup(int groupPos);
//设置选择指定的组
setSelectedGroup (int groupPosition) ;
//设置选择指定的子项
setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);
//返回所选择的组
getPackedPositionGroup (long packedPosition);
//返回所选择的子项
getPackedPositionForChild (int groupPosition, int childPosition) ;
//返回所选择项的类型(Child/Group)
getPackedPositionType (long packedPosition);
//判断此组是否展开
isGroupExpanded (int groupPosition);
  • 使用步骤

1.在布局文件中引用ExpandableListView

<ExpandableListView
        android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="5dp"android:childDivider="#cccccc"android:divider="#cccccc"android:dividerHeight="1px"/>

2.初始化与装配数据

public class MainActivity extends AppCompatActivity {private ExpandableListView listview;private AMapAdapter adapter;//先创建,防止NullPointExcaptionprivate ArrayList<Group> groups = new ArrayList<>();String[] groupStrs = {"广东省","湖南省","湖北省","江苏省","云南省","海南省"};String[] guangdong = {"深圳市","广州市","佛山市","东莞市","韶关市"};String[] hunan = {"长沙市","株洲市","衡阳市","湘潭市","益阳市"};String[] hubei = {"武汉市","襄阳市","荆州市","黄冈市","仙桃市"};String[] jiangsu = {"南京市","苏州市","泰州市","无锡市","徐州市"};String[] yunan = {"昆明市","普洱市","曲靖市","玉溪市","丽江市"};String[] hainan = {"海口市","东方市","琼海市","三亚市","文昌市"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initview();initdata();}/** 初始化ExpandableListView等视图*/private void initview(){listview = (ExpandableListView) findViewById(R.id.listview);listview.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {@Overridepublic boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {if (adapter != null){Group group = adapter.getGroup(i);Toast.makeText(MainActivity.this,"点击了"+group.getGroupName(),Toast.LENGTH_SHORT).show();}return false;}});listview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long l) {if (adapter != null){Child child = adapter.getChild(groupPosition, childPosition);Toast.makeText(MainActivity.this,"点击了"+child.getChildName(),Toast.LENGTH_SHORT).show();}return false;}});}/** 初始化数据-网络请求数据*/private void initdata(){//若是http请求,最好等数据回调成功后再装配数据(回调函数是主线程可直接装配,分线程可通过Handler再装配)//demo中数据均是伪造for (String groupName : groupStrs){ArrayList<Child> childs = new ArrayList<>();Group group = null;if (groupName.equals("广东省")){for (String name : guangdong){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}else if (groupName.equals("湖南省")){for (String name : hunan){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}else if (groupName.equals("湖北省")){for (String name : hubei){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}else if (groupName.equals("江苏省")){for (String name : jiangsu){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}else if (groupName.equals("云南省")){for (String name : yunan){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}else if (groupName.equals("海南省")){for (String name : hainan){Child child = new Child(name);childs.add(child);}group = new Group(groupName,childs);}groups.add(group);}if (groups.size() > 0){if (adapter == null){adapter = new AMapAdapter(this,groups);listview.setAdapter(adapter);}}}
}

3.继承BaseExpandableListAdapter(推荐使用)或实现ExpandableListAdapter

public class AMapAdapter extends BaseExpandableListAdapter {private Context mContext;private ArrayList<Group> mGroups;public AMapAdapter(){}public AMapAdapter(Context context, ArrayList<Group> groups){mContext = context;mGroups = groups;}@Overridepublic int getGroupCount() {return mGroups.size();}@Overridepublic int getChildrenCount(int i) {return mGroups.get(i).getChildList().size();}@Overridepublic Group getGroup(int i) {return mGroups.get(i);}@Overridepublic Child getChild(int groupPosition, int childPosition) {return mGroups.get(groupPosition).getChildList().get(childPosition);}@Overridepublic long getGroupId(int i) {return 0;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return 0;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int i, boolean isExpand, View contentView, ViewGroup viewGroup) {GroupViewHolder groupViewHolder = null;if (contentView == null){contentView = View.inflate(mContext, R.layout.group_item,null);groupViewHolder = new GroupViewHolder();groupViewHolder.gName = (TextView) contentView.findViewById(R.id.group_name);contentView.setTag(groupViewHolder);}else{groupViewHolder = (GroupViewHolder) contentView.getTag();}Group group = getGroup(i);groupViewHolder.gName.setText(group.getGroupName());return contentView;}@Overridepublic View getChildView(int groupId, int childId, boolean isLastChild, View contentView, ViewGroup viewGroup) {ChildViewHolder childViewHolder = null;if (contentView == null){contentView = View.inflate(mContext,R.layout.child_item,null);childViewHolder = new ChildViewHolder();childViewHolder.childName = (TextView) contentView.findViewById(R.id.child_name);contentView.setTag(childViewHolder);}else{childViewHolder = (ChildViewHolder) contentView.getTag();}Child child = getChild(groupId, childId);childViewHolder.childName.setText(child.getChildName());return contentView;}@Overridepublic boolean isChildSelectable(int i, int i1) {//若为false,会导致setOnChildClickListener失效return true;}class GroupViewHolder{public TextView gName;}class ChildViewHolder{public TextView childName;}
}

以上的方法跟ListView相似,这里就不累赘了
demo下载:
http://download.csdn.net/detail/lzp2015/9793392


3.去掉ExpandableListView的箭头
在ExpandableListView标签中添加如下属性,即可

android:groupIndicator="@null"

listSelector属性是设置点击Item的颜色

android:listSelector="@drawable/custom_listview_seletor"

如不需要显示右侧滚动条,设置scrollbars属性为none

android:scrollbars="none"

如需自定义grouIndicator

//1.去掉自带的groupIndicator
android:groupIndicator="@null"
//2.在group_item.xml中添加ImagView(根据自己需求去规划)
//3.在getGroupView()方法中添加图片
@Overridepublic View getGroupView(int i, boolean isExpand, View contentView, ViewGroup viewGroup) {if (isExpand){groupViewHolder.expandTag.setBackgroundResource(R.mipmap.list_view_indicate_down);}else{groupViewHolder.expandTag.setBackgroundResource(R.mipmap.list_view_indicate_right);}return contentView;}

4.解决setOnChildClickListener失效问题

将Adapter中isChildSelectable返回值改为true,若还没解决,可能是你childitem中某个视图一直占用了焦点而没释放

//是否允许childItem被选中
@Overridepublic boolean isChildSelectable(int i, int i1) {//若为false,会导致setOnChildClickListener失效return true;}

5.解决collapseGroup(i)崩溃问题
应用场景:
当点击某一个Group时,关闭之前打开的Group
错误代码
这里写图片描述
结果是出现ANR,并抛出java.lang.IndexOutOfBoundsException
这里写图片描述
这是ExpandabeListView的bug,解决办法:

listview.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {@Overridepublic void onGroupExpand(int groupPosition) {if (oldPostion == -1){oldPostion = groupPosition;}else{listview.collapseGroup(oldPostion);oldPostion = groupPosition;}} 
});

6.解决group_item.xml中包含CheckBox、EditText等,点击不能展开的问题
出现此类现象,原因是因为焦点被CheckBox、EditText获取导致的。
解决办法:
在item_item.xml(根据自己的xml文件)找到对应的视图(CheckBox、EditText等),设置其焦点初始值为false,完美解决

android:focusable="false"

http://chatgpt.dhexx.cn/article/lelULct1.shtml

相关文章

values_list()

转载&#xff1a;https://www.cnblogs.com/chenchao1990/p/5311531.html?utm_sourcetuicool&utm_mediumreferral

列表(lists)

Lists and the things you can do with them.Includes indexing(索引&#xff09;,slicing &#xff08;切片&#xff09;and mutating&#xff08;变异&#xff09;. 1.Python 中的列表表示有序的值序列。 以下是如何创建它们的示例&#xff1a; primes [2,3,5,7] #我们可以…

Android Preference API 用法--ListPreference(一)

一&#xff0e;ListPreference简介 我们都只知道SharedPreference非常适合于参数设置功能&#xff0c;在此处的preference 也是代表SharedPreference的意思&#xff0c;在SharedPreference中&#xff0c;我们可以迅速的将某些值保存进xml文件中&#xff0c;然后我们可以读取这…

android entries属性,ListPreference需要设置两个属性:android:entries和android:entryValues...

android:defaultValue"black" android:entries"array/setting_skintheme" android:entryValues"array/setting_skintheme_value" android:key"SkinTheme" android:summary"请选择您喜欢的软件皮肤颜色" android:title"…

Android ListPreference的用法

首先&#xff0c;我们明确&#xff0c;preference是和数据存储相关的。 其次&#xff0c;它能帮助我们方便的进行数据存储&#xff01;为什么这个地方一定要强调下方便的这个词呢&#xff1f;原因是&#xff0c;我们可以根本就不使用&#xff0c;我们有另外的N种办法可以实现同…

List总结

ArrayList与LinkedList的区别是什么&#xff1f; 从继承树&#xff0c;底层数据结构&#xff0c;线程安全&#xff0c;执行效率来进行分析。 1.底层使用的数据结构 ArrayList 底层使用的是Object数组&#xff0c;初始化时就会指向的会是一个static修饰的空数组&#xff0c;数…

android Preference ListPreference EditTextPreference

android中包含Preference ListPreference EditTextPreference等控件布局的写法&#xff0c;已经操作各个控件的事件介绍&#xff0c;如下 <?xml version"1.0" encoding"utf-8"?> <PreferenceScreen xmlns:android"http://schemas.android…

Android中ListPreference的使用

这篇主要是具体例子&#xff0c;可以先看一下理论&#xff0c;网址是&#xff1a;Android中Preference的使用以及监听事件分析 我们可以先看一下效果图 我们先截取不小段布局&#xff0c;代码如下&#xff1a; <ListPreferenceandroid:defaultValue"string/usb_defaul…

list列表的用法

List&#xff08;列表&#xff09;是 Python中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。列表是写在方括号 [ ] 之间&#xff0…

List 列表的用法

List&#xff08;列表&#xff09; 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。列表是写在方括号 [ ] 之间、用逗号…

自定义ListPreference弹出Dialog背景

公司最近项目需求是用实体键来在应用内操作,这就需要对那些可点击的widget的背景进行自定义,使其响应focus状态随即变化。大部分的layout改动都是挺简单的。 但是遇到一个主要的问题就是自带的PreferenceFragment,里面的layout不是通过平时常用的Button ImageView那些来写的…

android之ListPreference的用法_PreferenceActivity用法

首先&#xff0c;我们明确&#xff0c;preference是和数据存储相关的。 其次&#xff0c;它能帮助我们方便的进行数据存储&#xff01;为什么这个地方一定要强调下方便的这个词呢&#xff1f;原因是&#xff0c;我们可以根本就不使用&#xff0c;我们有另外的N种办法可…

ListPreference详解与使用

listprefenence比switchpreference多了一个arrays.xml&#xff0c;这个arrays.xml就是用来写我们需要的list的内容。 以切换mode功能为例&#xff0c;就是切换协议的mode&#xff0c;一共需要五个选项。除了switchpreference中的key&#xff0c;title&#xff0c;summary和pers…

互联网协议 — TCP — 流量控制

目录 文章目录 目录TCP 流量控制流量控制处理流程 TCP 流量控制 TCP 流量控制由滑动窗口&#xff08;Sliding Window&#xff09;技术支撑。Sender 根据 Receiver 返回 ACK 中包含的 Window Size 字段来动态调整自身发送 Segments 的速率&#xff0c;以此保证收发双方不会因为…

电信网络性能质量测量

电信网络性能质量测量 作者:千里孤行(http://blog.csdn.net/yanghehong) 为什么要有质量和性能的测量 • 验证系统架构,配置 • 定位已有问题 • 及早发现潜在问题 • 为系统架构演进提供数据支持 服务质量的四个视角 服务质量的网络部分和非网络部分 从网络角度出发, QoS…

网络性能指标简介

网络性能指标简介 1. 网络容量&#xff08;Network Capacity&#xff0c;NC&#xff09; 网络容量是描述无线网络性能的最重要的指标之一&#xff0c;该指标使得人们在给定无线信道的基本容量限制的条件下&#xff0c;能够确定一些应用在理论上是否可行。网络容量通常指理论上…

基于神经网络的天气质量指数预测

基于神经网络的空气质量指数预测 1 项目背景 1.1背景 随着我国经济的快速发展&#xff0c;大量的工厂企业以及尾气排放使得大气环境污染日益严重&#xff0c;所以大气污染的预测防治工作应该加大力度[1]。通过预测未来影响空气质量指数的污染物浓度&#xff0c;实现我们对短…

腾讯海外轻量服务网络质量下降原因和解决方法

腾讯海外轻量服务网络质量下降原因和解决方法 腾讯海外轻量服务网络质量下降原因和解决方法问题背景问题原因影响这个问题是否会自动解决呢?解决方案有吗?方案一: GAME加速.方案二: 使用优质带宽的中转服务器方案三: 让你的服务器提供方帮你一站式解决问题 腾讯海外轻量服务网…

NQA网络质量分析

NQA网络质量分析&#xff0c;是一种实时的网络性能探测和统计技术&#xff0c;可以对响应时间、网络抖动、丢包率等网络信息进行统计NQA能实时监视网络QOS&#xff0c;在网络发生故障时有效的诊断和定位。&#xff08;和BFD不同&#xff0c;BFD像侦测兵报告错误&#xff0c;NQA…

网络测量指标

文章目录 1 性能类指标1.1 时延1.2 带宽1.3 丢包 2 流量类指标3 拓扑类指标3.1 拓扑结构中心性3.2 拓扑结构相似性3.3 拓扑结构鲁棒性3.4 其他 1 性能类指标 1.1 时延 时延指一个报文或分组从网络的一端传送到另一端所需要的时间&#xff0c;包括发送时延&#xff08;传输时延…