`

动态添加删除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 + 1;

	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 = 0; 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(0, MENU_ADD, 0, "     添加        ");
		menu.add(0, MENU_DELETE, 0, "     删除        ");

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

}

至于里面的方法各自起什么作用,可以自己进行测试
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>



分享到:
评论
4 楼 Alicedetears 2013-03-12  
写的蛮详细的!
3 楼 ZZX19880809 2012-03-26  
连个图都没有,怎么看啊
2 楼 yellowbirds 2011-12-05  
怎么没有一点的注释说明文字啊!纠结啊!
1 楼 jackson200 2011-08-09  
写的比较详细! 

相关推荐

Global site tag (gtag.js) - Google Analytics