ExpandableListView控件的使用

article/2025/11/4 16:02:03

目录

一、ExpandableListView的介绍

二、适配器(ExpandableAdapter)

1、BaseExpandableListAdapter:

 BaseExpandableListAdapter例子

一、ExpandableListView的介绍

        ExpandableListView是ListView的子类。它是ListView的基础上进行了扩展,把应用中的列表分成几组,每组里又可以包含多个列表项。

二、适配器(ExpandableAdapter)

1、BaseExpandableListAdapter:

        BaseExpandableListAdapter是一个抽象类,用于实现可扩展的列表视图(ExpandableListView)。它包含了一些方法来帮助你管理和填充可扩展列表视图中的数据。以下是BaseExpandableListAdapter中常用的方法及其功能:

方法名功能
public abstract int getGroupCount()获取分组数量,即可扩展列表视图中的组数。
public abstract int getChildrenCount(int groupPosition)获取指定组中子项的数量。
public abstract Object getGroup(int groupPosition)获取指定组的数据对象。
public abstract Object getChild(int groupPosition, int childPosition)获取指定子项的数据对象。
public abstract long getGroupId(int groupPosition)获取指定组的ID。
public abstract long getChildId(int groupPosition, int childPosition)获取指定子项的ID。
public abstract boolean hasStableIds()判断分组和子项的ID是否稳定。
public abstract View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)获取指定组的视图对象。
public abstract View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)获取指定子项的视图对象。
public abstract boolean isChildSelectable(int groupPosition, int childPosition)判断指定子项是否可以被选中。

这些方法提供了访问和操作可扩展列表视图中数据的基本功能。通过继承BaseExpandableListAdapter并重写这些方法,可以实现自定义的可扩展列表视图适配器,以满足各种实际应用的需求。

 BaseExpandableListAdapter例子:

MainActivity: 

package com.example.expandablelistdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity {private ExpandableListView expandList;private List<String> groupData;//group的数据源private Map<Integer, List<ChildItem>> childData;//child的数据源private MyAdapter myAdapter;final int CONTEXT_MENU_GROUP_DELETE = 0;//添加上下文菜单时每一个菜单项的item IDfinal int CONTEXT_MENU_GROUP_RENAME = 1;final int CONTEXT_MENU_CHILD_EDIT = 2;final int CONTEXT_MENU_CHILD_DELETE = 3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();initView();}private void initData() {groupData = new ArrayList<>();groupData.add("第一组");groupData.add("第二组");groupData.add("第三组");List<ChildItem> childItems = new ArrayList<>();for (int i = 0; i < 10; i++) {ChildItem childData = new ChildItem("标题:"+i, R.drawable.ic_launcher_background);childItems.add(childData);}List<ChildItem> childItems2 = new ArrayList<ChildItem>();for (int i = 0; i < 5; i++) {ChildItem childData1 = new ChildItem("标题:"+i, R.drawable.ic_launcher_background);childItems2.add(childData1);}List<ChildItem> childItems3 = new ArrayList<ChildItem>();for (int i = 0; i < 2; i++) {ChildItem childData1 = new ChildItem("标题:"+i, R.drawable.ic_launcher_background);childItems3.add(childData1);}childData = new HashMap<Integer, List<ChildItem>>();childData.put(0, childItems);childData.put(1, childItems2);childData.put(2, childItems3);myAdapter = new MyAdapter(this, groupData, childData);}private void initView() {expandList = findViewById(R.id.expandlist);expandList.setAdapter(myAdapter);// 添加上下文的菜单registerForContextMenu(expandList);// 给子项添加点击事件expandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {Toast.makeText(MainActivity.this, "你单击了:"+myAdapter.getChild(groupPosition, childPosition), Toast.LENGTH_SHORT).show();return true;}});}/** 添加上下文菜单*/@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo)menuInfo;int type = ExpandableListView.getPackedPositionType(info.packedPosition);if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {menu.setHeaderTitle("Options");menu.add(0, CONTEXT_MENU_GROUP_DELETE, 0, "删除");menu.add(0, CONTEXT_MENU_GROUP_RENAME, 0, "重命名");}if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {menu.setHeaderTitle("Options");menu.add(1, CONTEXT_MENU_CHILD_EDIT, 0, "编辑");menu.add(1, CONTEXT_MENU_CHILD_DELETE, 0, "删除");}}/** 每个菜单项的具体点击事件*/@Overridepublic boolean onContextItemSelected(MenuItem item) {ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo)item.getMenuInfo();switch (item.getItemId()) {case CONTEXT_MENU_GROUP_DELETE:Toast.makeText(this, "这是group的删除", Toast.LENGTH_SHORT).show();break;case CONTEXT_MENU_GROUP_RENAME:Toast.makeText(this, "这是group的重命名", Toast.LENGTH_SHORT).show();break;case CONTEXT_MENU_CHILD_EDIT:Toast.makeText(this, "这是child的编辑", Toast.LENGTH_SHORT).show();break;case CONTEXT_MENU_CHILD_DELETE:Toast.makeText(this, "这是child的删除", Toast.LENGTH_SHORT).show();break;default:break;}return super.onContextItemSelected(item);}
}

MyAdapter:

package com.example.expandablelistdemo;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;import java.util.List;
import java.util.Map;public class MyAdapter extends BaseExpandableListAdapter{private Context mContext;// 每组的标题private List<String> groupTitle;//子项是一个map,key是group的id,每一个group对应一个ChildItem的listprivate Map<Integer, List<ChildItem>> childMap;public MyAdapter(Context context, List<String> groupTitle, Map<Integer, List<ChildItem>> childMap){this.mContext = context;this.groupTitle = groupTitle;this.childMap = childMap;}/*** 取得分组数*/@Overridepublic int getGroupCount() {return groupTitle.size();}/*** 取得指定分组的子元素数*/@Overridepublic int getChildrenCount(int groupPosition) {return childMap.get(groupPosition).size();}/*** 获取指定组的数据对象。* @param groupPosition* @return*/@Overridepublic Object getGroup(int groupPosition) {return groupTitle.get(groupPosition);}/*** 获取指定子项的数据对象。* @param groupPosition 每组的id* @param childPosition 子项的id* @return*/@Overridepublic Object getChild(int groupPosition, int childPosition) {//我们这里返回一下每个item的名称,以便单击item时显示return childMap.get(groupPosition).get(childPosition).getTitle();}/*** 得指定分组的ID* @param groupPosition 组的ID* @return groupPosition*/@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}/*** 判断分组和子项的ID是否稳定。* @return*/@Overridepublic boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {GroupHolder groupHolder = null;if (convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.group_item,null);groupHolder = new GroupHolder();groupHolder.groupImg = convertView.findViewById(R.id.img_group);groupHolder.groupTitle =  convertView.findViewById(R.id.tv_group_title);convertView.setTag(groupHolder);}else {groupHolder = (GroupHolder) convertView.getTag();}// 如果group被展开if (isExpanded){groupHolder.groupImg.setBackgroundResource(R.drawable.downarrow);}else {groupHolder.groupImg.setBackgroundResource(R.drawable.rightarrow);}groupHolder.groupTitle.setText(groupTitle.get(groupPosition));return convertView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {ChildHolder childHolder = null;if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.child_item, null);childHolder = new ChildHolder();childHolder.childImg = convertView.findViewById(R.id.img_child);childHolder.childTitle =  convertView.findViewById(R.id.tv_child_text);convertView.setTag(childHolder);}else {childHolder = (ChildHolder) convertView.getTag();}childHolder.childImg.setBackgroundResource(childMap.get(groupPosition).get(childPosition).getMarkerImgId());childHolder.childTitle.setText(childMap.get(groupPosition).get(childPosition).getTitle());return convertView;}/*** 判断指定子项是否可以被选中。* @param groupPosition* @param childPosition* @return*/@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}private class GroupHolder{ImageView groupImg;TextView groupTitle;}private class ChildHolder{ImageView childImg;TextView childTitle;}}

GroupItem:

package com.example.expandablelistdemo;public class GroupItem {private String title;private int imageId;private GroupItem(String title,int imageId){this.title = title;this.imageId = imageId;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;}
}

ChildItem:

package com.example.expandablelistdemo;public class ChildItem {private String title;private int markerImgId;public ChildItem(String title,int markerImgId){this.markerImgId = markerImgId;this.title = title;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getMarkerImgId() {return markerImgId;}public void setMarkerImgId(int markerImgId) {this.markerImgId = markerImgId;}
}

activity_main:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayoutandroid:layout_height="match_parent"android:layout_width="match_parent"xmlns:android="http://schemas.android.com/apk/res/android"><ExpandableListViewandroid:layout_height="match_parent"android:layout_width="match_parent"android:dividerHeight="1dp"android:divider="@android:color/white"android:cacheColorHint="#00000000"android:id="@+id/expandlist"/></LinearLayout>

child_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="horizontal"android:layout_height="match_parent"><ImageViewandroid:layout_marginTop="10dp"android:layout_height="50dp"android:layout_width="50dp"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:id="@+id/img_child"/><TextViewandroid:layout_marginTop="21dp"android:id="@+id/tv_child_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:layout_toRightOf="@id/img_child"android:text="xiangjiao"android:textSize="16sp" />
</LinearLayout>

group_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="horizontal"android:layout_height="match_parent"><ImageViewandroid:layout_marginTop="10dp"android:layout_height="50dp"android:layout_width="50dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:id="@+id/img_group"/><TextViewandroid:layout_marginTop="21dp"android:id="@+id/tv_group_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:layout_toRightOf="@id/img_child"android:text="水果"android:textSize="16sp" />
</LinearLayout>

效果图:

上一篇:ListView的使用:ListView控件的使用_敬往事一杯酒哈的博客-CSDN博客


 


http://chatgpt.dhexx.cn/article/2Jh2T8rW.shtml

相关文章

ExpandableListView的使用详解

在Android开发中&#xff0c;我们知道经常会用到ListView来加载一些列表数据&#xff0c;但有时候ListView并不能完全十分满足我们的需求。比如如下图的效果用 ExpandableListView实现起来就更方便点&#xff0c;我们直接用ExpandableListView&#xff0c;设置Group不能点击即可…

ExpandableListView实例

先来看效果图&#xff1a; demo中有三个group item和多个child item&#xff0c;group item包括一个指示器&#xff0c;一个标题和一个按钮。child item包括一个图片&#xff0c;一个标题和一个按钮。先来实现布局文件 1 activity_main.xml <?xml version"1.0&qu…

ExpandableListView使用方法详解

一、前言 “好记性不如烂笔头”&#xff0c;再次验证了这句话是真的很有道理啊&#xff0c;一个月前看了一下ExpandableListView的使用&#xff0c;今天再看居然忘了这个是干啥的了&#xff0c;今天就详细讲解一下ExpandableListView的使用方法&#xff0c;感觉对于二级条目显示…

ExpandableList的使用

首先&#xff0c;我们把一二级选择的对应的类写好。 看这些代码&#xff0c;最主要的是我在ParentStrings中写了一个List<ChildrenStrings>的一个方法&#xff0c;以便之后ChildrenStrings的存储和调用 下面是BusAdapter继承BaseExpandableAdapter public class BusAda…

可折叠列表ExpandableList

ExpandableList就是可展开的ListView 首先我们来看一下页面的布局 expandlist_layout.xml文件 <RelativeLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"htt…

Adapter类控件使用之ExpandableList(可折叠式列表)的基本使用

(一)概述 本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是 ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。至于 样子, 类似于QQ联系人列表,他的用法与ListView非常相似,只是ExpandableListViv…

如果在临汾遇见你

哈 如果在临汾遇见你&#xff0c;那么&#xff0c;我们一定要去平阳南街煤化巷口的宾库西餐厅&#xff0c;坐在只需消费15块钱就可以坐一整天的大厅散座上&#xff0c;聊着我们相见恨晚的话题。 如果在临汾遇见你&#xff0c;那么&#xff0c;我们一定要去传说的尧庙&#xff0…

吃完7家互联网大厂食堂,我回去就把老板开了

本文转载自 超人测评 不会还有人不知道&#xff08;中文&#xff09;字节跳动&#xff08;英文&#xff09;Bytedance的工牌&#xff0c;已经成为年轻人的社交货币了吧。 有人说它是“相亲市场的硬通货”&#xff0c;也有人将它称为“2021年最潮流时尚单品”。每当你在奶茶店…

围剿宏光MINI

NEW 关注Tech逆向思维视频号 最新视频→【做核酸&#xff1f;打疫苗&#xff1f;3分钟假期安全出行攻略】 出品&#xff5c;深途 文&#xff5c;黎明 编辑&#xff5c; 魏佳 有很长一段时间&#xff0c;汽车企业的老板和投资人&#xff0c;都热衷于造“大车”。蔚来、小鹏、威马…

《植物大战僵尸》的12个成功秘诀

口述 / James Gwertzman 整理 / 杨东杰 [caption id"attachment_6675" align"alignleft" width"263" caption"James Gwertzman PopCap亚太区总裁"] [/caption] 4月28日&#xff0c;在由长城会和CSDN联合主办的“开发者星球——TUP大…

只要10分钟,搭建属于个人的炫酷网站,你还在犹豫什么?

&#x1f482; 个人主页: IT学习日记&#x1f91f; 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦&#x1f485; 想寻找共同成长的小伙伴&#xff0c;请点击【技术圈子】 文章…

我的股票投资原则:专注业绩好、看得懂的消费品行业

本文概要&#xff1a;文以载道。总结了过往的经验教训&#xff0c;明确了未来的投资方向和股票投资圈。 我是一名Java程序员&#xff0c;今年心情有点烦躁&#xff0c;没怎么有耐心写工作之外的代码。 同时&#xff0c;我也是一名业余投资人&#xff0c;所以今年就又花了大量…

最近回了趟家,随便拍的照片

先贴下家对面的东山。呵呵。看上去光秃秃的。不过我看上去只有很深的亲切。 家里盖被子的东西 我大哥房间里面别人送的&#xff0d;&#xff0d;&#xff0d;堆绣  是我们湟中的一种农民搞的艺术品 家里的酸奶。  呵呵&#xff0c;大家很多人都记得西宁街头的那种勺子挖着…

破解网址_中国目前的破解组织大全

中国目前的破解组织大全&#xff08;2009版&#xff09;——[TFW]find31作品 管理提醒&#xff1a; 本帖被 朕很伤心 从 『 风云AD区 』 移动到本区(2009-06-23) 破解组织前管理员告诉你中国目前的破解组织现状——看了某个N年前的帖子而发&#xff0c;说实话我真的不忍心再看…

推荐 10 个不错的网络监视工具

点击上方“民工哥技术之路”选择“置顶或星标” 每天10点为你分享不一样的干货 有几个网络监视工具可以用于不同的操作系统。在这篇文章中&#xff0c;我们将讨论从 Linux 终端中运行的 10 个网络监视工具。 它对不使用 GUI 而希望通过 SSH 来保持对网络管理的用户来说是非常理…

【Java】Socket网络编程实现内网穿透、端口映射转发、内网穿透上网工具的编写,设置IP白名单防火墙

这里写目录标题 简介更新 一、背景1.1 情景假设1.2 想要达到的目的1.3 局限1.3 解决方案一&#xff08;路由器NAT&#xff09;1.4 解决方案二&#xff08;云服务器转发&#xff09; 二、方案介绍2.1 方案简介2.2 具体流程2.3 编程要点2.4 关于web管理IP白名单的更新2.5 关于soc…

计算机网络--Windows网络测试工具

实验目的 理解上述知识点所涉及的基本概念并学会使用这些工具测试网络的状态及从网上获取信息。 实验环境 安装了TCP/IP协议的Windows系统&#xff0c;包含实用的网络工具。 实验内容 完成下列要求&#xff0c;并记录实验步骤和结果 1、 检测本机的MAC地址 2、 检测本机网…

【小工具的制作】制作一个通过HTTP请求来实现上网认证的自动登录小工具

目录 1. 前言2. 分析3. 编码3.1 Python版3.1.1 编写Python脚本3.1.2 下载Python转EXE程序工具3.1.3 打包成EXE程序 3.2 Java版3.2.1 编写代码 4. 最后一步5. 总结 1. 前言 由于学校机房联网时&#xff0c;总是需要登录个人账号。为实现快速登录&#xff0c;我们就此问题给出了自…

常见的网络抓包工具推荐

因为发现好多人想抓包&#xff0c;但是不知道有哪些工具&#xff0c;今天我给大家推荐几款抓包工具&#xff0c;希望对大家有所帮助。 网络抓包工具的用途 网络抓包工具的主要功能是将网络执行的过程&#xff0c;详细的记录下来。如果你是一个程序员&#xff0c;肯定对网络抓…

【转】Fiddler抓包工具手机添加代理后连不上网解决办法

转载&#xff1a;Fiddler抓包工具手机添加代理后连不上网解决办法_数据结构和算法的博客-CSDN博客 最近&#xff0c;在工作中需要测试一个监控网络请求的SDK&#xff0c;需要校验该SDK记录的耗时数据的准确性。根据网上大神们提供的工作经验&#xff0c;可以利用Fiddler工具给…