- 浏览: 433525 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yehuiyan8002:
支持中文查询
快熟查找联系人 -
lehehe:
现成的接口,免费试用,http://www.haoservic ...
天气Widget -
D.Z:
android:focusable="false&q ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
freecode:
碰到该问题,CheckBox的android:focusabl ...
CheckBox在ListView 而导致其OnItemClickListener不会被触发 -
echohfut:
哥们,新博客是不是在墙外啊?不能访问。还有你怎么进行博客迁移的 ...
博客 迁移
ExpandableListView / ExpandableListActivity
二者关系 和 ListActivity / ListView 是一样的
[代码 步骤]
1. 定义含有ExpandableListView 的布局:main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout" > <ExpandableListView android:id="@+id/expandList" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
2. 定义数据结构List<String>, List<List<String>> 分别用于存放 Group / Children 的String
List<String> group; List<List<String>> child;
3. 初始化 List<String> List<List<String>> 并插入一些数据
public void initialData(){ group = new ArrayList<String>(); child = new ArrayList<List<String>>(); addInfo("griffinshi", new String[]{"13776117119","man","Jiangsu"}); addInfo("lancewu",new String[]{"1321134","man","Taiwan"}); addInfo("kandyli",new String[]{"12345"}); } public void addInfo(String p,String[] c){ group.add(p); List<String> item = new ArrayList<String>(); for(int i=0;i<c.length;i++){ item.add(c[i]); } child.add(item); }
3. 定义BaseExpandableListAdapter 并与List<String> List<List<String>> 数据相适配
public class InfoDetailsAdapter extends BaseExpandableListAdapter { Activity activity; public InfoDetailsAdapter(Activity a){ activity = a; } //child method stub @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return child.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return child.get(groupPosition).size(); } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub String string = child.get(groupPosition).get(childPosition); return getGenericView(string); } //group method stub @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return group.get(groupPosition); } @Override public int getGroupCount() { // TODO Auto-generated method stub return group.size(); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub String string = group.get(groupPosition); return getGenericView(string); } //View stub to create Group/Children 's View public TextView getGenericView(String s) { // Layout parameters for the ExpandableListView AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 64); TextView text = new TextView(activity); text.setLayoutParams(lp); // Center the text vertically text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); // Set the text starting position text.setPadding(36, 0, 0, 0); text.setText(s); return text; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } }
4. emulator 运行截图:
5. 下面说一下 数据更新 问题 包括:添加数据 删除数据
* 定义添加数据界面:add.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="姓名:" /> <EditText android:id="@+id/add_name" android:layout_width="200dip" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="电话:" /> <EditText android:id="@+id/add_phone" android:layout_width="200dip" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="性别:" /> <EditText android:id="@+id/add_sex" android:layout_width="200dip" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="住址:" /> <EditText android:id="@+id/add_home" android:layout_width="200dip" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/add_ok" android:layout_width="90dip" android:layout_height="wrap_content" android:text="OK" /> <Button android:id="@+id/add_no" android:layout_width="90dip" android:layout_height="wrap_content" android:text="NO" /> </LinearLayout> </LinearLayout>
* add.xml 里 View 的定义:
public void createDialogAdd(){ viewAdd = this.getLayoutInflater().inflate(R.layout.add, null); dialogAdd = new Dialog(this); dialogAdd.setContentView(viewAdd); dialogAdd.setTitle("输入新成员信息"); add_name = (EditText)viewAdd.findViewById(R.id.add_name); add_phone = (EditText)viewAdd.findViewById(R.id.add_phone); add_sex = (EditText)viewAdd.findViewById(R.id.add_sex); add_home = (EditText)viewAdd.findViewById(R.id.add_home); add_ok = (Button)viewAdd.findViewById(R.id.add_ok); add_no = (Button)viewAdd.findViewById(R.id.add_no); add_ok.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub String[] data = { add_phone.getText().toString(), add_sex.getText().toString(), add_home.getText().toString() }; addInfo(add_name.getText().toString(),data); dialogAdd.dismiss(); mAdapter.notifyDataSetChanged(); } }); add_no.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub dialogAdd.dismiss(); } }); }
* 运行截图:
* 定义删除数据界面:delete.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ID:" /> <EditText android:id="@+id/delete_id" android:layout_width="200dip" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/delete_ok" android:layout_width="90dip" android:layout_height="wrap_content" android:text="OK" /> <Button android:id="@+id/delete_no" android:layout_width="90dip" android:layout_height="wrap_content" android:text="NO" /> </LinearLayout> </LinearLayout>
* delete.xml 里View 定义:
public void createDialogDelete(){ viewDelete = this.getLayoutInflater().inflate(R.layout.delete, null); dialogDelete = new Dialog(this); dialogDelete.setContentView(viewDelete); dialogDelete.setTitle("删除指定成员"); delete_id = (EditText)viewDelete.findViewById(R.id.delete_id); delete_ok = (Button)viewDelete.findViewById(R.id.delete_ok); delete_no = (Button)viewDelete.findViewById(R.id.delete_no); delete_ok.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub String id = delete_id.getText().toString(); if(! id.equals("")){ int i = Integer.parseInt(id); group.remove(i); child.remove(i); dialogDelete.dismiss(); mAdapter.notifyDataSetChanged(); } } }); delete_no.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub dialogDelete.dismiss(); } }); }
* 运行截图:
最后 说一下ExpandableListView的回调函数 用于监听那个id 被expand
expandList.setOnGroupClickListener(new OnGroupClickListener(){ @Override public boolean onGroupClick(ExpandableListView arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast.makeText(activity,"[Group Click]:"+arg2,Toast.LENGTH_LONG).show(); return false; } }); expandList.setOnChildClickListener(new OnChildClickListener(){ @Override public boolean onChildClick(ExpandableListView arg0, View arg1, int arg2, int arg3, long arg4) { // TODO Auto-generated method stub Toast.makeText(activity,"[Child Click]:"+arg2+":"+arg3,Toast.LENGTH_LONG).show(); return false; } });
- HelloExpandListTest.rar (42.9 KB)
- 下载次数: 2517
评论
14 楼
yuyafly
2012-01-11
不错
13 楼
david25231
2011-02-17
好东西。。。谢了
12 楼
chensylsl
2011-02-16
这个控件非常不错 收藏起来了
11 楼
chensylsl
2011-02-16
我找了好久了 谢谢 哈哈
10 楼
彩虹神
2011-01-20
有没有办法控制改变它的默认界面,这个默认的实在是太丑了,怎么美化呢?
9 楼
sendy618
2010-12-18
不错 哈哈 收藏! 。。。
8 楼
蓝月儿
2010-12-05
这么全,好几个难点都让您帮忙点化了 呵呵
7 楼
tianyw
2010-11-01
正在犯愁怎么做,谢谢,学习啦!
顶你!!
顶你!!
6 楼
liuqun_567
2010-10-29
太经典了,多谢了,太有帮助了
5 楼
happy200318
2010-10-17
刚好用到这个控件,多谢你的教程!~谢谢
4 楼
tjayy
2010-10-03
正好看到这个控件 有点疑问 看了代码很不错 学习了
3 楼
xtcpcgx
2010-08-24
收藏,很好的资料,正要学习这一部分
2 楼
liangtiaolong
2010-08-09
附件为什么不能下载了啦???
1 楼
luyi-jn
2010-08-04
经典,保存了,多谢
发表评论
-
滑动抽屉 另一种解决办法
2010-07-09 17:43 0滑动抽屉 -
Spinner 定制化 增强版
2010-07-09 14:34 2608Spinner 作为下拉选 ... -
ListView 内容之分批显示
2010-06-25 20:38 5923ListView 内容循环显示 大家试想 假如 ... -
MediaScanner 研究
2010-06-23 15:21 3169MediaScanner 之所以拿MediaSc ... -
CheckBox在ListView 而导致其OnItemClickListener不会被触发
2010-06-22 20:55 19013CheckBox在ListView 而导致其OnItemCli ... -
获取Launcher 启动列表
2010-06-22 10:09 3138获取Launcher 启动列表 即 列出所有Launc ... -
PreferenceActivity 全接触
2010-06-19 12:53 9439PreferenceActivity 为了引入 ... -
android src 下载 编译 安装 全接触
2010-06-12 14:44 0android src - download install ... -
Intent.createChooser() 妙用
2010-06-12 11:14 5955Intent.createChooser(ntent targ ... -
SMS管理:收信箱 发信息 编写新信息
2010-06-07 08:14 14443SMS管理 [功能] 1. 收信箱:显示 ... -
求 android 手机 帮忙测试sms服务系统 谢谢
2010-06-05 08:25 1451Hi guys, 最近一段时间没有更新blog 因为一 ... -
流媒体 播放 理论篇
2010-05-28 14:42 2222流媒体播放 之所以为理论篇 因为该篇仅实现了播放功能 ... -
NDK 搭建与HelloWorld
2010-05-19 09:48 3224NDK [前提] 1. Cygwin 用于安装 ... -
自定义字体
2010-05-15 10:49 1220自定义字体: []代码 步骤] 1 ... -
模糊查找 再深入
2010-05-15 09:41 3158模糊查找 再深入 应某位大哥要求 再次对 SQLite ... -
快捷方式Bar + ViewGroup - 自定义
2010-05-09 09:20 2470TabActivity - 自定义 其实 这篇感觉极鸡 ... -
View 拖动&插入 研究
2010-05-09 07:14 3983View 拖动&插入 即: ... -
带图标 快捷键 Menu - 终极版
2010-05-04 20:23 1837Menu 改头换面 扩展如下: 1. 图标化文字 2 ... -
*.gif 解码 - 实践
2010-05-02 18:58 1733*.gif decode 前面已经说过 今天不打算再说了 ... -
*.gif 解码 - 理论
2010-05-01 21:11 1522我们知道Android 默认是不支持*.gif 的 但是 ...
相关推荐
在使用`ExpandableListActivity`时,开发者需要提供两部分数据:一组表示父项的数据集,以及与每个父项关联的一组子项数据集。通常,这些数据会通过适配器(如`ExpandableListAdapter`)进行封装,然后传递给`...
通过这个例子,开发者可以学习到如何在Android应用中使用`ExpandableListActivity`展示层次结构数据,并通过`Handler`实现动画效果。这在展示具有多级分类的数据时非常有用,例如日历应用的月份和日期、菜单的分类和...
通过以上步骤,我们就完成了使用`ExpandableListActivity`和`SimpleExpandableListAdapter`展示层次数据的过程。这种组合不仅提供了丰富的用户体验,还大大简化了开发流程,使开发者能够更加专注于应用程序的核心...
本篇笔记将深入探讨如何使用ExpandableListView,以及如何用HashMap作为数据源。 首先,ExpandableListView的核心在于它的数据模型,它由两部分组成:Groups(父项)和Childrens(子项)。每个Group可以包含多个...
`ExpandableListView`通常与`ExpandableListActivity`一起使用,就像`ListActivity`与`ListView`的关系一样。 首先,我们需要创建一个包含`ExpandableListView`的布局。在`main.xml`中,你可以看到以下代码: ```...
下面我们将深入探讨如何使用`ExpandableListView`。 首先,`ExpandableListView`的布局文件结构通常包含三个部分:主界面XML(如`main.xml`)、父标题界面XML(如`groups.xml`)和子内容界面XML(如`childs.xml`)...
在Android中,我们可以使用`ExpandableListActivity`或者普通的`Activity`配合`ExpandableListView`进行布局。数据通常由`ExpandableListAdapter`管理,这个适配器需要实现`BaseExpandableListAdapter`接口。 在...
在Android开发中,`ExpandableListView` 是一个非常实用的控件,它可以显示具有扩展功能的列表,即每个条目可以展开以显示更多的子条目,通常用于构建具有层级结构的数据展示。本教程将深入讲解如何在Android应用中...
在Android中,我们通常使用ExpandableListAdapter作为适配器,将数据绑定到ExpandableListView上。 1. **数据模型**:在源码中,你会看到一个自定义的数据模型,比如`ExpandableListData.java`,它包含了对父级和...
首先,`ActivityMain`继承自`ExpandableListActivity`,这是一个专门为`ExpandableListView`定制的Activity基类,它简化了扩展列表视图的集成。在`onCreate`方法中,我们设置Activity的标题,并创建了一个`...
5. **ExpandableListActivity.doc** - ExpandableListView是一种可扩展的列表视图,能展示层级结构的数据。这部分讲述了如何创建和管理子项,以及监听和响应用户的展开和折叠操作。 6. **ContentProvider.doc** - ...
在这个过程中,开发者可能会遇到各种问题,比如数据加载、UI更新、数据库操作等,但解决问题的过程也是编程的乐趣所在。Android API Demos中的ExpandableList1、ExpandableList2和ExpandableList3提供了很好的示例,...
适配器则负责将这些数据绑定到`ExpandableListView`上,这里可以使用`ExpandableListAdapter`的子类,如`BaseExpandableListAdapter`。 ```java // 创建数据源 List<String> groups = new ArrayList(); List...
在使用 ExpandableListView 时,开发者需要创建一个 ExpandableListAdapter 对象,该对象负责提供列表项的数据信息,并处理列表项的展开和收缩事件。ExpandableListAdapter 有两个主要方法:getGroupView() 和 ...