Android 基础入门教程2.5.5 ExpandableListView(可折叠列表)的基本使用

2.5.5 ExpandableListView(可折叠列表)的基本使用

分类Android 基础入门教程

本节引言:

本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。至于样子, 类似于QQ联系人列表,他的用法与ListView非常相似,只是ExpandableListVivew显示的列表项 需由ExpandableAdapter提供。 下面我们来学习这个控件的基本使用! 官方API:ExpandableListView


1.相关属性

  • android:childDivider:指定各组内子类表项之间的分隔条,图片不会完全显示, 分离子列表项的是一条直线
  • android:childIndicator:显示在子列表旁边的Drawable对象,可以是一个图像
  • android:childIndicatorEnd:子列表项指示符的结束约束位置
  • android:childIndicatorLeft:子列表项指示符的左边约束位置
  • android:childIndicatorRight:子列表项指示符的右边约束位置
  • android:childIndicatorStart:子列表项指示符的开始约束位置
  • android:groupIndicator:显示在组列表旁边的Drawable对象,可以是一个图像
  • android:indicatorEnd:组列表项指示器的结束约束位置
  • android:indicatorLeft:组列表项指示器的左边约束位置
  • android:indicatorRight:组列表项指示器的右边约束位置
  • android:indicatorStart:组列表项指示器的开始约束位置

2.实现ExpandableAdapter的三种方式

1.扩展BaseExpandableListAdpter实现ExpandableAdapter。

2.使用SimpleExpandableListAdpater将两个List集合包装成ExpandableAdapter

3.使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter 本节示例使用的是第一个,扩展BaseExpandableListAdpter,我们需要重写该类中的相关方法, 下面我们通过一个代码示例来体验下!


3.代码示例

我们来看下实现的效果图

下面我们就来实现上图的这个效果:

核心是重写BaseExpandableListAdpter,其实和之前写的普通的BaseAdapter是类似的, 但是BaseExpandableListAdpter则分成了两部分:组和子列表,具体看代码你就知道了!

另外,有一点要注意的是,重写isChildSelectable()方法需要返回true,不然不会触发 子Item的点击事件!下面我们来写写:

首先是组和子列表的布局:

item_exlist_group.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="5dp"> <TextView android:id="@+id/tv_group_name" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center_vertical" android:paddingLeft="30dp" android:text="AP" android:textStyle="bold" android:textSize="20sp" /> </LinearLayout>

item_exlist_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="5dp" android:background="#6BBA79"> <ImageView android:id="@+id/img_icon" android:layout_width="48dp" android:layout_height="48dp" android:src="@mipmap/iv_lol_icon1" android:focusable="false"/> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="15dp" android:focusable="false" android:text="提莫" android:textSize="18sp" /> </LinearLayout>

然后是自定义的Adapter类:

MyBaseExpandableListAdapter.java

/** * Created by Jay on 2015/9/25 0025. */ public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter { private ArrayList<Group> gData; private ArrayList<ArrayList<Item>> iData; private Context mContext; public MyBaseExpandableListAdapter(ArrayList<Group> gData,ArrayList<ArrayList<Item>> iData, Context mContext) { this.gData = gData; this.iData = iData; this.mContext = mContext; } @Override public int getGroupCount() { return gData.size(); } @Override public int getChildrenCount(int groupPosition) { return iData.get(groupPosition).size(); } @Override public Group getGroup(int groupPosition) { return gData.get(groupPosition); } @Override public Item getChild(int groupPosition, int childPosition) { return iData.get(groupPosition).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) { ViewHolderGroup groupHolder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate( R.layout.item_exlist_group, parent, false); groupHolder = new ViewHolderGroup(); groupHolder.tv_group_name = (TextView) convertView.findViewById(R.id.tv_group_name); convertView.setTag(groupHolder); }else{ groupHolder = (ViewHolderGroup) convertView.getTag(); } groupHolder.tv_group_name.setText(gData.get(groupPosition).getgName()); return convertView; } //取得显示给定分组给定子位置的数据用的视图 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolderItem itemHolder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate( R.layout.item_exlist_item, parent, false); itemHolder = new ViewHolderItem(); itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon); itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(itemHolder); }else{ itemHolder = (ViewHolderItem) convertView.getTag(); } itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId()); itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName()); return convertView; } //设置子列表是否可选中 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private static class ViewHolderGroup{ private TextView tv_group_name; } private static class ViewHolderItem{ private ImageView img_icon; private TextView tv_name; } }

PS:存储子列表的数据不一定要用ArrayList<ArrayList>这种,根据自己的需求 定义~

最后是MainActivity的布局以及Java代码:

布局文件:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" tools:context=".MainActivity"> <ExpandableListView android:id="@+id/exlist_lol" android:layout_width="match_parent" android:layout_height="match_parent" android:childDivider="#E02D2F"/> </RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity { private ArrayList<Group> gData = null; private ArrayList<ArrayList<Item>> iData = null; private ArrayList<Item> lData = null; private Context mContext; private ExpandableListView exlist_lol; private MyBaseExpandableListAdapter myAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; exlist_lol = (ExpandableListView) findViewById(R.id.exlist_lol); //数据准备 gData = new ArrayList<Group>(); iData = new ArrayList<ArrayList<Item>>(); gData.add(new Group("AD")); gData.add(new Group("AP")); gData.add(new Group("TANK")); lData = new ArrayList<Item>(); //AD组 lData.add(new Item(R.mipmap.iv_lol_icon3,"剑圣")); lData.add(new Item(R.mipmap.iv_lol_icon4,"德莱文")); lData.add(new Item(R.mipmap.iv_lol_icon13,"男枪")); lData.add(new Item(R.mipmap.iv_lol_icon14,"韦鲁斯")); iData.add(lData); //AP组 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon1, "提莫")); lData.add(new Item(R.mipmap.iv_lol_icon7, "安妮")); lData.add(new Item(R.mipmap.iv_lol_icon8, "天使")); lData.add(new Item(R.mipmap.iv_lol_icon9, "泽拉斯")); lData.add(new Item(R.mipmap.iv_lol_icon11, "狐狸")); iData.add(lData); //TANK组 lData = new ArrayList<Item>(); lData.add(new Item(R.mipmap.iv_lol_icon2, "诺手")); lData.add(new Item(R.mipmap.iv_lol_icon5, "德邦")); lData.add(new Item(R.mipmap.iv_lol_icon6, "奥拉夫")); lData.add(new Item(R.mipmap.iv_lol_icon10, "龙女")); lData.add(new Item(R.mipmap.iv_lol_icon12, "狗熊")); iData.add(lData); myAdapter = new MyBaseExpandableListAdapter(gData,iData,mContext); exlist_lol.setAdapter(myAdapter); //为列表设置点击事件 exlist_lol.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(mContext, "你点击了:" + iData.get(groupPosition).get(childPosition).getiName(), Toast.LENGTH_SHORT).show(); return true; } }); } }

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

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

相关文章

大模型完全解析:从小白到AI入门的必学知识体系

本文系统解析AI与大模型核心概念&#xff0c;从AI定义、大模型原理、GPT本质、AIGC应用到算力与Token等基础知识入手&#xff0c;清晰阐述AI发展的三个阶段(弱人工智能、强人工智能、超强人工智能)及当前所处位置&#xff0c;为读者提供结构化、易懂的AI入门指南。最全AI科普&a…

干货收藏!2026网络安全新机遇:AI技术引领高薪就业新时代

干货收藏&#xff01;2026网络安全新机遇&#xff1a;AI技术引领高薪就业新时代 文章分析2026年专科专业新增趋势&#xff0c;指出AI、智能化和数字经济相关专业成为热点。技术人才就业前景广阔&#xff0c;得益于政策支持、人才缺口扩大和薪资上涨。黑马程序员培训机构推出融…

Android 基础入门教程2.5.6 ViewFlipper(翻转视图)的基本使用

2.5.6 ViewFlipper(翻转视图)的基本使用 分类 Android 基础入门教程 本节引言&#xff1a; 本节给大家带了的是ViewFlipper&#xff0c;它是Android自带的一个多页面管理控件&#xff0c;且可以自动播放&#xff01; 和ViewPager不同&#xff0c;ViewPager是一页页的&#xf…

pytest框架:mark标记功能

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、mark标记在实际工作中&#xff0c;我们要写的自动化用例会比较多&#xff0c;也不会都放在一个py文件中&#xff0c;如果有几十个py文件&#xff0c;上百个方…

新手必看!2026年这3张入门级网安证书,让你轻松踏入网络安安全行业

新手必看&#xff01;2026年这3张入门级网安证书&#xff0c;让你轻松踏入网络安全行业 如果你正准备进入网络安全行业&#xff0c;却还在纠结该考哪张证书作为起点&#xff0c;那么这篇文章会给你清晰的答案。 2026年&#xff0c;网络安全人才缺口依旧巨大&#xff0c;而对新…

初级网络安全工程师必看:全网最强的SSRF+XXE漏洞挖掘笔记教程,黑客技术零基础入门到精通实战!

一、Server-side request forgery (SSRF) 01、Basic SSRF against the local server 描述 该实验室具有库存检查功能&#xff0c;可从内部系统获取数据。 为了解决实验室&#xff0c;更改股票检查 URL 以访问管理界面http://localhost/admin并删除用户carlos。 解决方案 …

课程论文别再 “凑字数”!宏智树 AI:三步写出导师点赞的高分学术答卷

学期末的课程论文&#xff0c;堪称大学生的 “学术初体验”。但不少同学的写作状态却是&#xff1a;选题靠 “蒙”&#xff0c;文献靠 “堆”&#xff0c;查重靠 “改”&#xff0c;最后交出的论文要么是 “教材内容复刻版”&#xff0c;要么是 “网络观点拼盘”&#xff0c;不…

Android 基础入门教程2.5.7 Toast(吐司)的基本使用

2.5.7 Toast(吐司)的基本使用分类 Android 基础入门教程本节引言&#xff1a;好的&#xff0c;终于学习完Adapter类相关的一些控件&#xff0c;当然除了讲解的那几个&#xff0c;还有其他很多的 相关的控件&#xff0c;就不慢慢讲解了~有需要的自行查阅文档&#xff0c;查看相关…

基于单片机的可调直流稳压电源

2 系统的总体设计 2.1 系统的设计思路 对于单片机的调节基础之上&#xff0c;可以设置出对应的结构&#xff0c;可以发泄在结构图当中&#xff0c;这是一个非常完整的系统&#xff0c;并且主要通过由单片机模块显示电压模块以及电源模块及电源模块等进行组成&#xff0c;在设计…

基于单片机的楼宇智能照明系统

摘 要 近年来现代化建设颇具成效。城市发展建设作为现代化建设的重要一角&#xff0c;不仅仅在城市定位、技术革新、降低能耗等方面努力争先&#xff0c; 也在文化建设方面大放异彩。而智能楼宇作为高质量生活不可或缺的一环&#xff0c;智能照明也随之变得格外重要&#xff0…

白蚁监测仪:能根据长期监测数据预测白蚁的活动趋势和繁殖周期

白蚁虽小&#xff0c;危害却极大&#xff0c;它们悄无声息地蛀蚀建筑、树木&#xff0c;等人们察觉时&#xff0c;往往已造成难以挽回的损失。白蚁监测仪的出现&#xff0c;为应对这一难题提供了有效手段。白蚁监测仪运用了先进的生物传感与智能监测技术。其内部设有特制的诱饵…

手动设计 VS 宏智树 AI:问卷从 “无效数据” 到 “实证硬核” 的蜕变

作为专注论文写作科普的教育博主&#xff0c;后台总能收到粉丝的灵魂拷问&#xff1a;“为什么我熬了 3 天设计的问卷&#xff0c;回收的数据却成了‘学术废品’&#xff1f;”“明明参考了文献&#xff0c;题项还是被导师批‘逻辑混乱’‘信效度为零’&#xff1f;” 传统问卷…

基于单片机的空气质量检测系统的设计

第二章 系统方案设计 2.1 系统总体方案 本设计包含数据采集部分、数据处理部分和数据传输部分。数据采集部分采用了气体浓度检测传感器和ADC转换芯片设计&#xff0c;将物理量转换成输出稳定的数字信号&#xff0c;提升精准度。系统使用的温湿度传感器芯片直接测量温湿度。核心…

羽毛球思维养成课:韩宁波的战术意识培养术

羽毛球思维养成课&#xff1a;韩宁波的战术意识培养术 在羽毛球竞技领域&#xff0c;战术意识是决定比赛胜负的核心要素。国家二级运动员、资深战术教练韩宁波&#xff0c;通过"观察-分析-执行"三维训练体系&#xff0c;构建了独特的战术意识培养术。该体系融合数据…

MySQL 多表关联,最高效的查询方式:NLJ ,这样用性能翻5倍

概念 NLJ&#xff0c;全称 Index Nested-Loop Join&#xff08;基于索引的嵌套循环关联&#xff09;。它是MySQL 在执行 JOIN 时最常用、也是效率最高的算法之一。 它的核心思想是&#xff1a;用驱动表的每一行&#xff0c;去被驱动表的索引里做等值查找&#xff0c;从而把“…

开题报告怎么写不被毙?宏智树 AI 科普:三步搭建高质量学术蓝图

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被 “开题报告改了 N 遍还被导师打回” 的求助刷屏。选题太泛没创新、文献综述像流水账、技术路线混乱看不懂…… 这些问题堪称开题写作的 “致命三连”。其实&#xff0c;一份合格的开题报告本质是 **“向导师证明你的研…

进阶-InnoDB引擎--逻辑存储结构

一、MySQL进阶 “你写的每一行 SQL&#xff0c;最终都会在 InnoDB 的精密架构中找到归宿。” —— 理解 InnoDB 的逻辑存储结构&#xff0c;是数据库性能调优与系统设计的基石。 1. InnoDB引擎 为什么我们要关心 InnoDB&#xff1f; 在现代 Web 应用中&#xff0c;MySQL 几乎…

用热爱浇筑专业:韩宁波的羽球教育初心录

韩宁波的羽球教育初心录&#xff1a;用热爱浇筑专业 一、初心萌芽&#xff1a;从赛场冠军到教育引路人 韩宁波的羽毛球生涯始于对胜利的渴望&#xff0c;却最终升华成对教育的执着。作为省级单打冠军&#xff0c;他在训练中曾遭遇技术瓶颈&#xff1a;正手杀球时速始终无法突…

2026年1000道Java架构师岗面试题汇总

半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人。面试中总结了1000道经典的Java面试题&#xff0c;里面包含面试要回答的知识重点&#xff0c;并且我根据知识类型进行了分类&#xff0…

60N03-ASEMI“30V耐压新标杆”60N03

编辑&#xff1a;ll 60N03-ASEMI“30V耐压新标杆”60N03 型号&#xff1a;60N03 沟道&#xff1a;NPN 品牌&#xff1a;ASEMI 封装&#xff1a;TO-252 批号&#xff1a;最新 导通内阻&#xff1a;4.3mΩ 漏源电流&#xff1a;60A 漏源电压&#xff1a;30V 引脚数量&a…