原文地址 :http://blog.sina.com.cn/s/blog_9dbea139010127cb.html
test的效果图:
第一步:定义一个适配器类ExpandableAdapter继承BaseExpandableListAdapte
代码如下:
package net.loonggg.expandable;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapte
r;
import android.widget.TextView;
public class ExpandableAdapter extends BaseExpandableListAdapte
r {
private String[] groups = new String[] { "我的好友", "家人", "同事", "黑名单" };
private String[][] child = new String[][] {
{ "张三", "李四", "王五", "赵六", "宋七" }, { "loonggg", "timmy", "哥哥" },
{ "比尔盖茨", "乔布斯", "巴菲特" }, { "苏丹红", "敌敌畏" } };
private Context context;
public ExpandableAdapter(Context context) {
this.context = context;
}
@Override
public int getGroupCount() { // 取得组的个数
return groups.length;
}
@Override
public int getChildrenCount(int groupPosition) { // 取得子项个数
return child[groupPosition].length;
}
@Override
public Object getGroup(int groupPosition) { // 取得组对象
return groups[groupPosition];
}
@Override
public Object getChild(int groupPosition, int childPosition) { // 取得指定的子项
return child[groupPosition][childPosition];
}
@Override
public long getGroupId(int groupPosition) { // 取得组id
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) { // 取得子项id
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
TextView tv = buildTextView();
tv.setText(getGroup(groupPosition).toString());
return tv;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
TextView tv = buildTextView();
tv.setText(getChild(groupPosition, childPosition).toString());
return tv;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private TextView buildTextView() {
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 35);
TextView tv = new TextView(context);
tv.setTextSize(15);
tv.setGravity(Gravity.LEFT);
tv.setLayoutParams(params);
tv.setPadding(40, 5, 5, 10);
return tv;
}
}
第二步:设置布局文件main.xml
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
</LinearLayout>
第三步:MainActivity
代码如下:
package net.loonggg.expandable;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private ExpandableListView elistView; // 定义树型组件
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
elistView = (ExpandableListView) findViewById(R.id.elistView);
registerForContextMenu(elistView); // 给树形组件注册绑定上下文对象
elistView.setAdapter(new ExpandableAdapter(this)); // 绑定适配器组件
elistView.setOnGroupClickListener(new OnGroupClickListenerImpl
());// 设置组项单击事件
elistView.setOnGroupExpandListener
(new OnGroupExpandListenerImp
l()); // 展开分组事件
elistView.setOnGroupCollapseListen
er(new OnGroupCollapseListenerI
mpl());// 关闭分组事件
elistView.setOnChildClickListener(new OnChildClickListenerImpl
()); // 设置子项单击事件
}
private class OnChildClickListenerImpl
implements OnChildClickListener {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(
MainActivity.this,
"groupPosition " + groupPosition + " childPosition "
+ childPosition, 1).show();
return false;
}
}
private class OnGroupClickListenerImpl
implements OnGroupClickListener {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
Toast.makeText(MainActivity.this, "groupPosition " + groupPosition,
1).show();
return false;
}
}
private class OnGroupExpandListenerImp
l implements OnGroupExpandListener {
@Override
public void onGroupExpand(int groupPosition) {
Toast.makeText(MainActivity.this, "打开组", 1).show();
}
}
private class OnGroupCollapseListenerI
mpl implements
OnGroupCollapseListener {
@Override
public void onGroupCollapse(int groupPosition) {
Toast.makeText(MainActivity.this, "关闭组", 1).show();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
ExpandableListView.ExpandableListContextMen
uInfo info = (ExpandableListView.ExpandableListContextMen
uInfo) menuInfo;
int type = ExpandableListView
.getPackedPositionType(info.packedPosition); // 取得操作的菜单项
int group = ExpandableListView
.getPackedPositionGroup(info.packedPosition); // 取得菜单项所在的菜单组
int child = ExpandableListView
.getPackedPositionChild(info.packedPosition); // 取得子菜单项的索引
Toast.makeText(MainActivity.this,
"type = " + type + ",group = " + group + ",child = " + child,
Toast.LENGTH_SHORT).show(); // 显示提示框
if (type == 0 && child == -1) {
menu.setHeaderTitle("信息操作");
menu.add(menu.NONE, menu.FIRST + 1, 1, "联系人详情");
menu.add(menu.NONE, menu.FIRST + 2, 2, "拨打电话");
menu.add(menu.NONE, menu.FIRST + 3, 3, "发送短信");
menu.add(menu.NONE, menu.FIRST + 4, 4, "查看信箱");
menu.add(menu.NONE, menu.FIRST + 5, 5, "链接网站");
} else {
menu.setHeaderTitle("信息操作");
menu.add(menu.NONE, menu.FIRST + 6, 1, "联系人详情");
menu.add(menu.NONE, menu.FIRST + 7, 2, "拨打电话");
menu.add(menu.NONE, menu.FIRST + 8, 3, "发送短信");
}
}
}