可折叠列表ExpandableList

article/2025/11/4 15:56:45

ExpandableList就是可展开的ListView
首先我们来看一下页面的布局

expandlist_layout.xml文件

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ExpandableListView
        android:id="@+id/expendlist"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>

expendlist_group.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical"android:padding="10dp"><ImageView
        android:id="@+id/group_img"android:layout_width="36dp"android:layout_height="36dp"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:src="@drawable/ic_next" /><TextView
        android:id="@+id/groupname_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toRightOf="@+id/group_img"android:layout_marginLeft="10dp"android:text="张三"android:textSize="18sp" />
</RelativeLayout>

expendlist_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="70dp"android:orientation="horizontal"android:gravity="center_vertical"android:layout_marginBottom="1dp"android:padding="10dp"><ImageView
        android:id="@+id/icon_img"android:layout_width="48dp"android:layout_height="48dp"android:layout_marginLeft="20dp"android:src="@drawable/android" /><LinearLayout
        android:layout_marginLeft="50dp"android:layout_width="match_parent"android:layout_height="60dp"android:gravity="center_vertical"android:orientation="vertical" ><TextView
            android:id="@+id/itemname_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="22sp"android:textStyle="bold"android:text="Android" /><TextView
            android:id="@+id/info_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="编程学习" /></LinearLayout>
</LinearLayout>

创建适配器MyExpandableListViewAdapter

package com.example.administrator.expandablelistview;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;public class MyExpandableListViewAdapter extends BaseExpandableListAdapter {private Context mContext = null;private List<String> mGroupList = null;private List<List<String>> mItemList = null;public MyExpandableListViewAdapter(Context context, List<String> groupList,List<List<String>> itemList) {this.mContext = context;this.mGroupList = groupList;this.mItemList = itemList;}
// 获取组的个数@Overridepublic int getGroupCount() {return mGroupList.size();}
// 获取指定组中的子元素个数@Overridepublic int getChildrenCount(int groupPosition) {return mItemList.get(groupPosition).size();}
//获取指定组中的数据@Overridepublic String getGroup(int groupPosition) {return mGroupList.get(groupPosition);}//获取指定组中的指定子元素数据。@Overridepublic String getChild(int groupPosition, int childPosition) {return mItemList.get(groupPosition).get(childPosition);}// 获取指定组的ID,这个组ID必须是唯一的@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}//获取指定组中的指定子元素ID@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}
// 获取显示指定组的视图对象//groupPosition 组位置
//isExpanded    该组是展开状态还是伸缩状态
//convertView   重用已有的视图对象
//parent        返回的视图对象始终依附于的视图组@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent) {GroupHolder groupHolder = null;if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.expendlist_group, null);groupHolder = new GroupHolder();groupHolder.groupNameTv = (TextView) convertView.findViewById(R.id.groupname_tv);groupHolder.groupImg = (ImageView) convertView.findViewById(R.id.group_img);convertView.setTag(groupHolder);} else {groupHolder = (GroupHolder) convertView.getTag();}if (isExpanded) {groupHolder.groupImg.setImageResource(R.drawable.ic_up);//展开} else {groupHolder.groupImg.setImageResource(R.drawable.ic_next);//未展开}groupHolder.groupNameTv.setText(mGroupList.get(groupPosition));return convertView;}//获取一个视图对象,显示指定组中的指定子元素数据。@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild,View convertView, ViewGroup parent) {ItemHolder itemHolder = null;if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.expendlist_item, null);itemHolder = new ItemHolder();itemHolder.nameTv = (TextView) convertView.findViewById(R.id.itemname_tv);itemHolder.iconImg = (ImageView) convertView.findViewById(R.id.icon_img);convertView.setTag(itemHolder);} else {itemHolder = (ItemHolder) convertView.getTag();}itemHolder.nameTv.setText(mItemList.get(groupPosition).get(childPosition));itemHolder.iconImg.setBackgroundResource(R.drawable.head_img_1);return convertView;}// 组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。@Overridepublic boolean hasStableIds() {return true;}//是否选中指定位置上的子元素。@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}class GroupHolder {public TextView groupNameTv;public ImageView groupImg;}class ItemHolder {public ImageView iconImg;public TextView nameTv;}
}

ExpandableListActivity.java

package com.example.administrator.expandablelistview;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class ExpandableListActivity extends AppCompatActivity {private ExpandableListView mExpandableListView = null;// 列表数据private List<String> mGroupNameList = null;private List<List<String>> mItemNameList = null;// 适配器private MyExpandableListViewAdapter mAdapter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.expandlist_layout);// 获取组件mExpandableListView = (ExpandableListView) findViewById(R.id.expendlist);mExpandableListView.setGroupIndicator(null);// 初始化数据initData();// 为ExpandableListView设置AdaptermAdapter = new MyExpandableListViewAdapter(this, mGroupNameList, mItemNameList);mExpandableListView.setAdapter(mAdapter);// 监听组点击mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {@Overridepublic boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id) {if (mGroupNameList.get(groupPosition).isEmpty()) {return true;}return false;}});// 监听每个分组里子控件的点击事件mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition,int childPosition, long id) {Toast.makeText(ExpandableListActivity.this,mAdapter.getGroup(groupPosition) + ":"+  mAdapter.getChild(groupPosition, childPosition) ,Toast.LENGTH_SHORT).show();return false;}});}// 初始化数据private void initData(){// 组名mGroupNameList = new ArrayList<String>();mGroupNameList.add("后端开发");mGroupNameList.add("前端开发");mGroupNameList.add("移动开发");mItemNameList = new  ArrayList<List<String>>();// 后端组List<String> itemList = new ArrayList<String>();itemList.add("Java");itemList.add("SpringBoot");itemList.add("Python");itemList.add("Go");itemList.add("PHP");itemList.add("C");itemList.add("C++");mItemNameList.add(itemList);// 前端组itemList = new ArrayList<String>();itemList.add("HTML/CSS ");itemList.add("JavaScript");itemList.add("Vue.js");itemList.add("jQuery");itemList.add("Bootstrap");itemList.add("Angular");mItemNameList.add(itemList);// 移动组itemList = new ArrayList<String>();itemList.add("Android");itemList.add("iOS");itemList.add("React native");itemList.add("WEEX");mItemNameList.add(itemList);}
}

最终实现的效果图
这里写图片描述
这里写图片描述


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

相关文章

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工具给…

超好用的网络小工具

整理了一下一些自己使用的网络链路状态测试工具。 一、RAWCAP-本地回路抓包 本地使用wireshark无法抓回路包&#xff0c;为此百度了一下RawCap可以抓回路包&#xff0c;亲测可用。特记录下来。 缺点&#xff1a;有一些系统需要安装Microsoft .NET Framework 4 https://www.m…

8大轻型网管工具,网络管理好帮手

从设备发现到系统、网络和流量可视性&#xff0c;这些轻型的网管工具非常实用。在网络和服务器世界&#xff0c;重点是可视性、可视性、可视性&#xff0c;如果你不知道你的网络和服务器在每天每秒正在做什么&#xff0c;你很可能会出问题。幸运的是&#xff0c;这里有很多好工…

上网本之必备网络工具推荐

伴随着中国3G无线网络的全面商用运营&#xff0c;“上网本”已经成为2009年最炙手可热的词汇之一。“上网本”便宜实惠、小巧便携&#xff0c;但低配置却是它的一个软肋&#xff0c;所以能够完全配合“上网本”使用的低耗能软件似乎并不多。这里&#xff0c;笔者结合自己的一些…

网络测速工具

一、Speedtest测试外网网速 Speedtest是用来测试网络性能的开源软件&#xff0c;在Linux下面安装Speedtest可以用来测试网络出口的上传和下载速度&#xff0c;帮助排查网络方面导致的故障。 官网&#xff1a; Github链接&#xff1a;https://github.com/sivel/speedtest-cli …

windows - 网络流量监控工具

由于需要在本地的流量监控工具 1、DUMeterPortable 可以对当前的pc网络的上下行做记录和统计&#xff0c;可以统计每天的流量控制&#xff0c;程序实时记录 2、BW 功能比较强大&#xff0c;但是监控比较烦人&#xff0c;如果是查看流量的话&#xff0c;这个软件没有必要 3、…