ExpandableListView讲解
/* * Android开发之ExpandableListView * 北京Android俱乐部群:167839253 * Created on: 2012-7-23 * Author: blueeagle * Email:liujiaxiang@gmail.com */ 有时候,使用ListView并不能满足应用程序所需要的功能。有些应用程序需要多组ListView,这时候我们就要使用一种新的控件ExpandableListView——可以扩展的ListView。它的作用就是将ListView进行分组。就好像我们使用QQ的时候,有“我的好友”,“陌生人”,“黑名单”一样,点击一下会扩展开,再点击一下又会收缩回去。 ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。这些子项来自于与该视图关联的ExpandableListAdapter。 每一个可以扩展的列表项的旁边都有一个指示符(箭头)用来说明该列表项目前的状态(这些状态一般是已经扩展开的列表项,还没有扩展开的列表项,子列表项和最后一个子列表项)。可以使用方法:setChildIndicator(Drawable),setGroupIndicator(Drawable)(或者相应的XML文件的属性) 去设置这些指示符的样式。当然也可以使用默认的指示符。布android.R.layout.simple_expandable_list_item_1,android.R.layout.simple_expandable_list_item_2 和ListView一样,ExpandableListView也是一个需要Adapter作为桥梁来取得数据的控件。一般适用于ExpandableListView的Adapter都要继承BaseExpandableListAdapter这个类,并且必须重载getGroupView和getChildView这两个最为重要的方法。 BaseExpandableListAdapter的主要重载方法如下: public abstract ObjectgetChild (int groupPosition, int childPosition) 取得与指定分组、指定子项目关联的数据. 参数 groupPosition 包含子视图的分组的位置. childPosition 指定的分组中的子视图的位置. 返回 与子视图关联的数据. public abstract long getChildId (int groupPosition, intchildPosition) 取得给定分组中给定子视图的ID. 该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID). 参数 groupPosition 包含子视图的分组的位置. childPosition 要取得ID的指定的分组中的子视图的位置. 返回 与子视图关联的ID. public abstract View getChildView (int groupPosition, intchildPosition, boolean isLastChild, View convertView, ViewGroup parent) 取得显示给定分组给定子位置的数据用的视图. 参数 groupPosition 包含要取得子视图的分组位置. childPosition 分组中子视图(要返回的视图)的位置. isLastChild 该视图是否为组中的最后一个视图. convertView 如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getChildView(int, int,boolean, View, ViewGroup)创建的视图. parent 该视图最终从属的父视图. 返回 指定位置相应的子视图. public abstract int getChildrenCount (int groupPosition) 取得指定分组的子元素数. 参数 groupPosition 要取得子元素个数的分组位置. 返回 指定分组的子元素个数. public abstract long getCombinedChildId (long groupId, long childId) 取得一览中可以唯一识别子条目的 ID(包括分组ID和子条目ID).可扩展列表要求每个条目 (分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID. 该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果 hasStableIds() 为真,该函数返回的ID必须是固定不变的. 参数 groupId 包含子条目ID的分组条目ID. childId 子条目的ID. 返回 可以在所有分组条目和子条目中唯一识别该子条目的ID(可能是固定不变的). public abstract long getCombinedGroupId (long groupId) 取得一览中可以唯一识别子条目的 ID(包括分组ID和子条目ID).可扩展列表要求每个条目 (分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID. 该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果 hasStableIds() 为真,该函数返回的ID必须是固定不变的. 参数 groupId 分组条目ID. 返回 可以在所有分组条目和子条目中唯一识别该分组条目的ID(可能是固定不变的). public abstract Object getGroup (int groupPosition) 取得与给定分组关联的数据. 参数 groupPosition 分组的位置. 返回 指定分组的数据. public abstract int getGroupCount () 取得分组数. 返回 分组数. public abstract long getGroupId (int groupPosition) 取得指定分组的ID.该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID). 参数 groupPosition 要取得ID的分组位置. 返回 与分组关联的ID. public abstract View getGroupView (int groupPosition, booleanisExpanded, View convertView, ViewGroup parent) 取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象, 要想获取子元素的视图对象,就需要调用 getChildView(int, int, boolean, View, ViewGroup). 参数 groupPosition 决定返回哪个视图的组位置 . isExpanded 该组是展开状态还是收起状态 . convertView 如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getGroupView(int, boolean,View, ViewGroup)创建的视图. parent 该视图最终从属的父视图. 返回 指定位置相应的组视图. public abstract boolean hasStableIds () 是否指定分组视图及其子视图的ID对应的后台数据改变也会保持该ID. 返回 是否相同的ID总是指向同一个对象. public abstract boolean isChildSelectable (int groupPosition, intchildPosition) 指定位置的子视图是否可选择. 参数 groupPosition 包含要取得子视图的分组位置. childPosition 分组中子视图的位置. 返回 是否子视图可选择. 注意: 在XML布局文件中,如果ExpandableListView上一级视图的大小没有严格定义的话,则不能对ExpandableListView的android:layout_height 属性使用wrap_content值。 (例如,如果上一级视图是ScrollView的话,则不应该指定wrap_content的值,因为它可以是任意的长度。不过,如果ExpandableListView的上一级视图有特定的大小的话,比如100像素,则可以使用wrap_content) 如果由于开发的时候粗心,对ExpandableListView指定wrap_content的值,则会报一个在SetContentView处的空指针错误。 根据描述,先看一个简单的例子: 定义XML的代码如下: [html] view plaincopy
就是在LinearLayout中布置了一个ExpandableListView。 在JAVA中的代码如下: [java] view plaincopy
效果如下图所示: 这样就完成了一个最简单的ExpandableListView的控件。 在实际开发过程中,常常有不同的需求,比如每一个child需要不同的控件,每一个group或者child需要有图标,图标显示需要不一样,需要设置背景等各种各样能够让我们的程序变得美观的需求。那么下面就逐一讨论一下ExpandableListView如何实现这些需求。 比如,为ExpandableListView设置背景,并且默认展开第n组,n从0开始计数,则只需要添加如下代码: [java] view plaincopy
则效果如下: 改变每个组前面的图标,并且图标样式随着合拢和展开不同,则只需要在res/drawable目录下定义文件:Indicator.xml [html] view plaincopy
在JAVA文件中添加: [java] view plaincopy
效果如下: 对于其他的属性设置,可以参考以下属性说明: android:childDivider 来分离子列表项的图片或者是颜色。注:图片不会完全显示,分离子列表项的是一条直线 android:childIndicator 在子列表项旁边显示的指示符。注:可以是一个图片 android:childIndicatorLeft 子列表项指示符的左边约束位置。注:即从左端0位置开始计数,比如,假设指示符是一个图标,给定这个属性值为3dip,则表示从左端起3dip开始显示此图标。 android:childIndicatorRight 子列表项指示符的右边约束位置。注:表示右端到什么位置结束 android:groupIndicator 在组列表项旁边显示的指示符。注:可以是一个图片。 android:indicatorLeft 组列表项指示器的左边约束位置。注:表示左端从什么位置开始。 android:indicatorRight 组列表项指示器的右边约束位置。注:表示右端到什么位置结束。 当然,还可以使用自定义的View去描述group和child,自定义的View可以和布局文件一样,写在layout文件夹下。例如命名为group.xml或者child.xml。 例如,我们定义一个child项由一个ImageView和一个TextView来组成,则可以定义child.xml为: [html] view plaincopy
对于其中的属性不再做详细说明。 对于ExpandableListView中的数据,还可以用以下方式定义:
这样就可以将自定义的View写入到child中,当然,这里也可以不用布局文件来定义View,也可以自己用代码实现View。 补充知识: 对于ExpandableListView相应的,也有一个ExpandableListActivity与之对应,对于只需要一个ExpandableListView的Activity,则只需要使用ExpandableListActivity来完成相应的功能就可以了。但是需要注意一点的是:在main.xml页面中添加如下代码:
这个ID不能随便修改,否则会出现异常:java.lang.RuntimeException:Your content must have a ExpandableListView whose id attribute is'android.R.id.list'. |
ExpandableListView讲解相关推荐
- 详细讲解ExpandableListView显示和查询仿QQ分组列表用户信息
在我们的项目开发过程中,经常会对用户的信息进行分组,即通过组来显示用户的信息,同时通过一定的查询条件来显示查询后的相关用户信息,并且通过颜色选择器来设置列表信息的背景颜色. 其中借鉴xiaanming ...
- android中的高级组件(三)(ExpandableListView,ImageSwitcher,Gallery)
ExpandableListView 分组列表视图 和ListView不同的是它是一个两级的滚动列表视图,每一个组可以展开,显示一些子项,类似于QQ列表,这些项目来至于ExpandableListAd ...
- ExpandableListView实现可展开的ListView
最近朋友公司的一个项目中用到了一ListView的Item嵌套ListView的功能,朋友问我这种效果该怎么实现.ListView嵌套ListView的情况在实际开发中用到的还是比较多的.谷歌也给了我 ...
- cocos2dx 讲解
Cocos2d-x 优点:高效稳定.易用(引擎本身).开源.跨平台 缺点:缺少稳定及功能全面的工具链.上手难 出于对Cocos2d-x引擎的热爱,作者也需要来稍加点评,在优点上不想多做评论,正是因为它 ...
- android 开发 电台,Android 开发自己的网络收音机3——电台分类(ExpandableListView)
上一篇文章说了使用SlidingMenu开源项目实现侧滑栏,今天主要是讲解多级列表ExpandableListView的使用,以及如何使用它实现电台分类管理.ExpandableListView是An ...
- Android基础入门教程——2.4.12 ExpandableListView(可折叠列表)的基本使用
Android基础入门教程--2.4.12 ExpandableListView(可折叠列表)的基本使用 标签(空格分隔): Android基础入门教程 本节引言: 本节要讲解的Adapter类控件是 ...
- java 下拉列表 可折叠 qq分组_2.5.5 ExpandableListView(可折叠列表)的基本使用
本节引言: 本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含 ...
- Android入门教程四十五之ExpandableListView(可折叠列表)的基本使用
本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项. ...
- ExpandableListView(可折叠列表)的基本使用
本节引言: 本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类,在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多 ...
最新文章
- 马斯克:今年占全球发射质量65%,星舰5月或首次轨道试飞
- JAVA常用设计模式(一、单例模式、工厂模式)
- #用construct2做游戏
- Java教程分享:使用Spring框架能带来哪些好处?
- c语言字符运算 =,C语言运算符
- C#中的线程(三) 使用多线程
- java arraylist 字符串_Java ArrayList、string、string[]之间的转换
- Fiori Elements - list report.xml layout and fragment xml load
- 网关限流(令牌桶算法)
- 【集群仿真】基于matlab固定翼无人机集群仿真演示平台【含Matlab源码 1497期】
- Unity3D lable控件
- Oracle VM VirtualBox Ubuntu1804虚拟机磁盘扩容
- 混音教程入门|新手学混音必须注意这9点!| MZD Studios
- php网站设计国内外研究状况,毕业论文中的国内外研究现状怎么写啊
- 无限复活服务器,绝地求生无限复活玩法说明 绝地求生无限复活分数计算规则/吃鸡攻略...
- iOS 极光推送没有声音怎么办?
- Syn-QG: Syntactic and Shallow S emantic Rules for Question Generation阅读笔记
- HiveHive的两种访问方式
- 软件设计模式--软件设计演变过程
- Redis的使用和认识
热门文章
- Ubuntu使用gzip与bzip2与rar和tar压缩解压
- 《终结拖延症》读书笔记
- ubuntu16 环境配置
- html怎么显示一个点赞的心形,jquery心形点赞关注效果的简单实现
- 【软考】高级系统架构设计师学习经验分享
- CISP——密码学的应用
- OpenStack配置Cinder出现“You must set cylinders.You can do this from the extra functions menu.”解决办法
- SpringBoot使用elasticsearch-rest-high-level-client操作ElasticSearch
- MySQL 8——学习笔记03(插入、更新、删除 数据 [DML语句]、查询数据 [DQL语句])
- QQ自动强制加好友代码