编辑器加载中...   http://www.cdtarena.com/gpx/201207/4304.html

有时候,使用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) 取得显示给定分组给定子位置的数据用的视图.【达内3G培训】 参数 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(可能是固定不变的).【达内3G培训】 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 plaincopyprint?

<?xml version="1.0" encoding="utf-8"?>

就是在LinearLayout中布置了一个ExpandableListView。 在JAVA中的代码如下:【达内3G培训】 [java] view plaincopyprint? package com.blueeagle.www; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; public class ExpandableListViewActivity extends Activity { private List GroupData;//定义组数据 private List<List> ChildrenData;//定义组中的子数据 private void LoadListDate() { GroupData = new ArrayList(); GroupData.add("国家"); GroupData.add("人物"); GroupData.add("武器"); ChildrenData = new ArrayList<List>(); List Child1 = new ArrayList(); Child1.add("蜀国"); Child1.add("魏国"); Child1.add("吴国"); ChildrenData.add(Child1); List Child2 = new ArrayList(); Child2.add("关羽"); Child2.add("张飞"); Child2.add("典韦"); Child2.add("吕布"); Child2.add("曹操"); Child2.add("甘宁"); Child2.add("郭嘉"); Child2.add("周瑜"); ChildrenData.add(Child2); List Child3 = new ArrayList(); Child3.add("青龙偃月刀"); Child3.add("丈八蛇矛枪"); Child3.add("青钢剑"); Child3.add("麒麟弓"); Child3.add("银月枪"); ChildrenData.add(Child3); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LoadListDate(); ExpandableListView myExpandableListView = (ExpandableListView)findViewById(R.id.myExpandableListView); myExpandableListView.setAdapter(new ExpandableAdapter()); } private class ExpandableAdapter extends BaseExpandableListAdapter { @Override public Object getChild(int groupPosition, int childPosition) { return ChildrenData.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return 0; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView myText = null; if (convertView != null) { myText = (TextView)convertView; myText.setText(ChildrenData.get(groupPosition).get(childPosition)); } else { myText = createView(ChildrenData.get(groupPosition).get(childPosition)); } return myText; } @Override public int getChildrenCount(int groupPosition) { return ChildrenData.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return GroupData.get(groupPosition); } @Override public int getGroupCount() { return GroupData.size(); } @Override public long getGroupId(int groupPosition) { return 0; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView myText = null; if (convertView != null) { myText = (TextView)convertView; myText.setText(GroupData.get(groupPosition)); } else { myText = createView(GroupData.get(groupPosition)); } return myText; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } private TextView createView(String content) { AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 80); TextView myText = new TextView(ExpandableListViewActivity.this); myText.setLayoutParams(layoutParams); myText.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); myText.setPadding(80, 0, 0, 0); myText.setText(content); return myText; } } } 效果如下图所示: 这样就完成了一个最简单的ExpandableListView的控件。 在实际开发过程中,常常有不同的需求,比如每一个child需要不同的控件,每一个group或者child需要有图标,图标显示需要不一样,需要设置背景等各种各样能够让我们的程序变得美观的需求。那么下面就逐一讨论一下ExpandableListView如何实现这些需求。【达内3G培训】 比如,为ExpandableListView设置背景,并且默认展开第n组,n从0开始计数,则只需要添加如下代码: [java] view plaincopyprint? myExpandableListView.setBackgroundResource(R.drawable.background); myExpandableListView.expandGroup(0); 则效果如下: 改变每个组前面的图标,并且图标样式随着合拢和展开不同,则只需要在res/drawable目录下定义文件:Indicator.xml [html] view plaincopyprint? 在JAVA文件中添加: [java] view plaincopyprint? myExpandableListView.setGroupIndicator(this.getResources().getDrawable(R.drawable.indicator)); 效果如下: 对于其他的属性设置,可以参考以下属性说明:【达内3G培训】 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 plaincopyprint?

<?xml version="1.0" encoding="utf-8"?>

对于其中的属性不再做详细说明。 对于ExpandableListView中的数据,还可以用以下方式定义: 【达内3G培训】 [java] view plaincopyprint? List<Map<String, String>> groups = new ArrayList<Map<String, String>>(); Map<String, String> group1 = new HashMap<String, String>(); group1.put("group", "国家"); … … groups.add(group1); … … //准备第一个一级列表中的二级列表数据:三个二级列表,分别显示"魏国"、"蜀国"和"吴国" List<Map<String, String>> child1 = new ArrayList<Map<String, String>>(); Map<String, String> child1Data1 = new HashMap<String, String>(); child1Data1.put("child", "魏国"); … … child1.add(child1Data1); … … //准备第二个一级列表中的二级列表数据:八个二级列表,显示"关羽"、"张飞"、"典韦"、"吕布"、"曹操"、"甘宁"、"郭嘉"、"周瑜" List<Map<String, String>> child2 = new ArrayList<Map<String, String>>(); Map<String, String> child2Data1 = new HashMap<String, String>(); child2Data1.put("child", "关羽"); … … child2.add(child2Data1); … … //准备第三个一级列表中的二级列表数据:五个二级列表,显示 "青龙偃月刀"、"丈八蛇矛枪"、 "青钢剑"、"麒麟弓"、"银月枪" List<Map<String, String>> child3 = new ArrayList<Map<String, String>>(); Map<String, String> child3Data1 = new HashMap<String, String>(); child3Data1.put("child", "青龙偃月刀"); … … child3.add(child3Data1); … … //用一个list对象保存所有的二级列表数据 List<List<Map<String, String>>> childs = new ArrayList<List<Map<String, String>>>(); childs.add(child1); childs.add(child2); childs.add(child3); 针对上述数据定义方式,修改java文件: 例如:在getChildView函数中做如下编写, String text = groups.get(groupPosition).get("group"); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //获取一级列表布局文件,设置相应元素属性 LinearLayout linearLayout = (LinearLayout) layoutInflater.inflate(R.layout.group, null); TextView textView = (TextView)linearLayout.findViewById(R.id.textView01); textView.setText(text); return linearLayout; 这样就可以将自定义的View写入到child中,当然,这里也可以不用布局文件来定义View,也可以自己用代码实现View。 补充知识: 对于ExpandableListView相应的,也有一个ExpandableListActivity与之对应,对于只需要一个ExpandableListView的Activity,则只需要使用ExpandableListActivity来完成相应的功能就可以了。但是需要注意一点的是:在main.xml页面中添加如下代码: [html] view plaincopyprint? 会出现异常:java.lang.RuntimeException:Your content must have a ExpandableListView whose id attribute is'android.R.id.list'.

转载于:https://www.cnblogs.com/shuiyun/archive/2012/10/17/2728497.html

Android开发之ExpandableListView相关推荐

  1. android开发之ExpandableListView的使用,实现类似QQ好友列表

    由于工作需要,今天简单研究了一下ExpandableListView,做了一个类似QQ列表的Demo,和大家分享一下. 效果图如下: 先来看看主布局文件: <RelativeLayout xml ...

  2. Android开发之ExpandableListView可拓展列表和子item左滑结合

    Hello!各位大神好,这是我的第一篇博客,大二学生初学安卓还不到几个月,所以希望不足之处能够多多指教. 在Android开发中,我们经常会遇到点击,展开,可拓展列表的使用,同时可恶的产品经理还要求你 ...

  3. Android开发之ExpandableListView: 可展开的ListView

    ExpandableListView: 可展开的ListView ListView 对于Android开发者来说是再熟悉不过的了,不过ListView的功能也有限.当需要展示第二层级数据时,使用Exp ...

  4. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  5. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  6. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  7. android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...

  8. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  9. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

最新文章

  1. windows中使用git和开源中国
  2. build的时候出错,fatal error LNK1103
  3. springBoot静态资源处理
  4. 如何将Apple Mail建议用于事件和联系人
  5. 文件服务器搭建_小型企业文件存储服务器的搭建四部曲
  6. angularjs详解
  7. 【数据库】MySQL表的增删改查
  8. 第十届中国开源黑客松等你来
  9. IOS快捷指令的用法(快捷指令库使用方法)
  10. 100以内的质数(基础算法)
  11. xp此计算机无法连接到,WinXP打印机共享无法连接如何解决?
  12. 生活在同一片土地上,印度人肤色差异为何那么大?
  13. 第十七届全国大学生智能车竞赛航天智慧物流获奖证书
  14. C语言实现机器猫绘制
  15. 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标
  16. springboot+vue在线答疑系统(源码+说明文档)
  17. 第三届全国中医药院校大学生程序设计竞赛(部分题解)更新中~
  18. Lecture4 反向传播(Back Propagation)
  19. Go开发 之 基础语法(变量的声明、初始化、作用域,匿名变量,多变量赋值,变量逃逸分析)
  20. 个人站长可以考虑的几种赚钱模式

热门文章

  1. win10 x64中inlineHook SSDT里面的函数
  2. 小寒也会写程序(三) .
  3. Python 问题 SyntaxError: Non-ASCII character '\xe9' in file
  4. 我输入,你生成代码,手写代码生成
  5. 修改数据库表结构(SQLserver)
  6. 基金投资学会这一篇就差不多了
  7. webmagic学习之路-2:采集安居客经纪人列表
  8. 多点开花的海康威视,凭何实现“智能跃级”?
  9. IP Camera (IPC),CHIPUP
  10. 超算中心CentOS环境