Android 动态添加删除ExpandableListView的item的例子
这个例子可以学习到如下几点:
1.通过自定义Dialog(单独布局的xml文件进行弹出显示)
2.通过menu点击监听添加,删除view中的items
3.点击ExpandableListView中group和child的事件监听
下面是代码:
1.ExpandableListViewStudy.Java
package cn.com.example;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
public class ExpandableListViewStudy extends Activity {
public final static int MENU_ADD = Menu.FIRST;
public final static int MENU_DELETE = Menu.FIRST + ;
ExpandableListView expandList;
InfoDetailsAdapter adapter;
Activity activity;
List<String> group;
List<List<String>> child;
// 初始化group child内容
public void initialData() {
group = new ArrayList<String>();
child = new ArrayList<List<String>>();
addInfo("group 1", new String[] { "one 1", "two 1", "three 1" });
addInfo("group 2", new String[] { "one 2", "two 2", "three 2" });
addInfo("group 3", new String[] { "one 3", "two 3", "three 3" });
}
public void addInfo(String p, String[] c) {
group.add(p);
List<String> item = new ArrayList<String>();
for (int i = ; i < c.length; i++) {
item.add(c[i]);
}
child.add(item);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
activity = this;
expandList = (ExpandableListView) findViewById(R.id.expandList);
// 初始化各级元素
initialData();
// 适配器内容
adapter = new InfoDetailsAdapter(this, group, child);
expandList.setAdapter(adapter);
expandList.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
System.out.println("The row id of the group clicked" + arg3);
Toast.makeText(activity, "[Group Click]:" + arg2,
Toast.LENGTH_SHORT).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_SHORT).show();
return false;
}
});
}
// 下述2个函数处理Menu按钮的事件
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(, MENU_ADD, , " 添加 ");
menu.add(, MENU_DELETE, , " 删除 ");
return super.onCreateOptionsMenu(menu);
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
Log.i("", "FRIEND_ID");
createDialogAdd();
dialogAdd.show();
break;
case MENU_DELETE:
Log.i("", "FRIEND_ID");
createDialogDelete();
dialogDelete.show();
break;
}
return super.onOptionsItemSelected(item);
}
EditText add_name, add_phone, add_sex, add_home;
EditText delete_id;
Button add_ok, add_no;
Button delete_ok, delete_no;
Dialog dialogAdd, dialogDelete;
public void createDialogAdd() {
Log.i("", "createDialogAdd");
View 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();
adapter.notifyDataSetChanged();
}
});
add_no.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
dialogAdd.dismiss();
}
});
}
public void createDialogDelete() {
View 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();
adapter.notifyDataSetChanged();
}
}
});
delete_no.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
dialogDelete.dismiss();
}
});
}
}
2.InfoDetailsAdapter.java(适配器文件,用于提供给View内容)
package cn.com.example;
import java.util.List;
import android.app.Activity;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
//为expandable list view 提供内容的基类
public class InfoDetailsAdapter extends BaseExpandableListAdapter {
Activity activity;
List<String> group;
List<List<String>> child;
public InfoDetailsAdapter(Activity a, List<String> group,
List<List<String>> child) {
activity = a;
this.group = group;
this.child = child;
}
// child method stub
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
// System.out.println("*******************"+child.get(groupPosition).get(childPosition));
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 long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return group.size();
}
@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, );
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(, , , );
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;
}
}
至于里面的方法各自起什么作用,可以自己进行测试
3.main.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" android:id="@+id/layout">
<ExpandableListView android:id="@+id/expandList"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>
4.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 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 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 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 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 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>
这个布局可以优化一下
5.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>
Android 动态添加删除ExpandableListView的item的例子的更多相关文章
- 编辑 Ext 表格(一)——— 动态添加删除行列
一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除. (1) 动态添加表格的行 gridS ...
- 用Javascript动态添加删除HTML元素实例 (转载)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js实现网页收藏功能,动态添加删除网址
<html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"&g ...
- Android动态添加Device Admin权限
/********************************************************************** * Android动态添加Device Admin权限 ...
- jquery动态添加删除div--事件绑定,对象克隆
我想做一个可以动态添加删除div的功能.中间遇到一个问题,最后在manong123.com开发文摘 版主的热心帮助下解答了(答案在最后) 使用到的jquery方法和思想就是:事件的绑定和销毁(unbi ...
- jQuery动态添加删除CSS样式
jQuery框架提供了两个CSS样式操作方法,一个是追加样式addClass,一个是移除样式removeClass,下面通过一个小例子讲解用法. jQuery动态追加移除CSS样式 <!DOCT ...
- JS动态添加删除html
本功能要求是页面传一个List 集合给后台而且页面可以动态添加删除html代码需求如下: 下面是jsp页面代码 <%@ page language="java" pageEn ...
- Angular-表单动态添加删除
angular本身不允许去操作DOM,在angular的角度来说,所有操作都以数据为核心,剩下的事情由angular来完成.所以说,想清楚问题的根源,解决起来也不是那么困难. 前提 那么,要做的这个添 ...
- jQuery动态添加删除select项
// 添加 function col_add() { var selObj = $("#mySelect"); var value="value"; var t ...
随机推荐
- linux用户和组管理
添加组groupadd sftp 把用户mysftp加入组sftp中:gpasswd -a mysftp sftp 把用户mysftp加入组sftp中:usermod -a -G sftp mysft ...
- hdu City Game
做这题之前建议做一下hdu1506题,两道题是极度相似的题,不同的是这个要处理的是m行,所以可以用一个dp[][]数组存储矩形的高度,之后就变成hdu1506了. 例如测试样例: 0 1 1 1 1 ...
- 分布式架构高可用架构篇_05_fastdfs集群的安装
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 移动WEB 性能优化方案
最近一项 研究表明,80%的网民对移动端的浏览体验感到失望,同时,当体验提升时,他们会在智能手机上花费更多的时间. 这不奇怪,因为64%的智能手机用户希望网站可以在4秒内加载完毕,但一半的网站花费了二 ...
- CSS兼容性
1,浮动 ie6中,设置浮动的元素,width自动包裹内容了.通常我们要设定一下这个元素的宽度 子元素浮动父容器高度不能自适应的CSS解决方法 网页前端工作者经常会遇到子元素设置float浮动后导致父 ...
- gitlab & gerrit & git & repo & jenkins
Omnibus GitLab documentation(中文安装说明) 在自己的服务器上部署 GitLab 社区版->较为全面 GIT & REPO & GERRIT (三) ...
- Apache Spark源码走读之5 -- DStream处理的容错性分析
欢迎转载,转载请注明出处,徽沪一郎,谢谢. 在流数据的处理过程中,为了保证处理结果的可信度(不能多算,也不能漏算),需要做到对所有的输入数据有且仅有一次处理.在Spark Streaming的处理机制 ...
- js 创建书签小工具之理论
我们一直在寻找增加浏览体验的方法,有的方法众所周知,有的则鲜为人知.我原本认为书签小工具属于后者,非常令人讨厌的东西.令我非常懊恼的是我发现在这个问题上我完全是错误的.它并不是令人厌烦的,而是以用户为 ...
- 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- 实时查看linux网卡流量
将下列脚本保存为可执行脚本文件,比如叫traff.sh. 1.本脚本可自定义欲查看接口,精确到小数,并可根据流量大小灵活显示单位. 2.此脚本的采集间隔为1秒. 3.此脚本不需要额外再安装软件,可在急 ...