`
gryphone
  • 浏览: 433525 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

ExpandableListView / ExpandableListActivity 使用及数据更新

阅读更多

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;
			}
        	
        });

 

分享到:
评论
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  
经典,保存了,多谢

相关推荐

    ExpandableListActivity

    在使用`ExpandableListActivity`时,开发者需要提供两部分数据:一组表示父项的数据集,以及与每个父项关联的一组子项数据集。通常,这些数据会通过适配器(如`ExpandableListAdapter`)进行封装,然后传递给`...

    ExpandableListActivity例子,自动展开

    通过这个例子,开发者可以学习到如何在Android应用中使用`ExpandableListActivity`展示层次结构数据,并通过`Handler`实现动画效果。这在展示具有多级分类的数据时非常有用,例如日历应用的月份和日期、菜单的分类和...

    ExpandableListActivity和SimpleExpandableListAdapter的基本使用详解

    通过以上步骤,我们就完成了使用`ExpandableListActivity`和`SimpleExpandableListAdapter`展示层次数据的过程。这种组合不仅提供了丰富的用户体验,还大大简化了开发流程,使开发者能够更加专注于应用程序的核心...

    Android学习笔记(二五): 多信息显示-ExpandableListView的使用.doc

    本篇笔记将深入探讨如何使用ExpandableListView,以及如何用HashMap作为数据源。 首先,ExpandableListView的核心在于它的数据模型,它由两部分组成:Groups(父项)和Childrens(子项)。每个Group可以包含多个...

    android的ExpandableListView组件.doc

    `ExpandableListView`通常与`ExpandableListActivity`一起使用,就像`ListActivity`与`ListView`的关系一样。 首先,我们需要创建一个包含`ExpandableListView`的布局。在`main.xml`中,你可以看到以下代码: ```...

    Android ExpandableListView展开列表控件使用实例

    下面我们将深入探讨如何使用`ExpandableListView`。 首先,`ExpandableListView`的布局文件结构通常包含三个部分:主界面XML(如`main.xml`)、父标题界面XML(如`groups.xml`)和子内容界面XML(如`childs.xml`)...

    Android-ExpandableListView制作时间轴-TimeLine

    在Android中,我们可以使用`ExpandableListActivity`或者普通的`Activity`配合`ExpandableListView`进行布局。数据通常由`ExpandableListAdapter`管理,这个适配器需要实现`BaseExpandableListAdapter`接口。 在...

    分享Android中ExpandableListView控件使用教程

    在Android开发中,`ExpandableListView` 是一个非常实用的控件,它可以显示具有扩展功能的列表,即每个条目可以展开以显示更多的子条目,通常用于构建具有层级结构的数据展示。本教程将深入讲解如何在Android应用中...

    Android应用源码之expandableList1_expandableList.zip

    在Android中,我们通常使用ExpandableListAdapter作为适配器,将数据绑定到ExpandableListView上。 1. **数据模型**:在源码中,你会看到一个自定义的数据模型,比如`ExpandableListData.java`,它包含了对父级和...

    Android支持展开和收缩功能的列表控件[汇编].pdf

    首先,`ActivityMain`继承自`ExpandableListActivity`,这是一个专门为`ExpandableListView`定制的Activity基类,它简化了扩展列表视图的集成。在`onCreate`方法中,我们设置Activity的标题,并创建了一个`...

    Mars Android视频教程的笔记

    5. **ExpandableListActivity.doc** - ExpandableListView是一种可扩展的列表视图,能展示层级结构的数据。这部分讲述了如何创建和管理子项,以及监听和响应用户的展开和折叠操作。 6. **ContentProvider.doc** - ...

    Android 个人理财工具三:添加账单页面 上

    在这个过程中,开发者可能会遇到各种问题,比如数据加载、UI更新、数据库操作等,但解决问题的过程也是编程的乐趣所在。Android API Demos中的ExpandableList1、ExpandableList2和ExpandableList3提供了很好的示例,...

    Android仿QQ好友列表实现列表收缩与展开

    适配器则负责将这些数据绑定到`ExpandableListView`上,这里可以使用`ExpandableListAdapter`的子类,如`BaseExpandableListAdapter`。 ```java // 创建数据源 List&lt;String&gt; groups = new ArrayList(); List...

    android列表控件实现展开、收缩功能

    在使用 ExpandableListView 时,开发者需要创建一个 ExpandableListAdapter 对象,该对象负责提供列表项的数据信息,并处理列表项的展开和收缩事件。ExpandableListAdapter 有两个主要方法:getGroupView() 和 ...

Global site tag (gtag.js) - Google Analytics