MainActivity如下:
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
public class ExpandableListViewTestActivity extends Activity {
private ExpandableListView elistview = null; // 定义树型组件
private ExpandableListAdapter adapter = null; // 定义适配器对象
CheckBox childBox;
TextView childTextView;
private HashMap<String, Boolean> statusHashMap;
View childItem = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 默认布局管理器
this.elistview = (ExpandableListView) super.findViewById(R.id.elistview); // 取得组件
this.adapter = new MyExpandableListAdapter(this); // 实例化适配器
this.elistview.setAdapter(this.adapter); // 设置适配器
this.elistview.setOnChildClickListener(new OnChildClickListenerImpl()); // 设置子项单击事件
this.elistview.setOnGroupClickListener(new OnGroupClickListenerImpl());// 设置组项单击事件
this.elistview.setOnGroupCollapseListener(new OnGroupCollapseListenerImpl());// 关闭分组事件
this.elistview.setOnGroupExpandListener(new OnGroupExpandListenerImpl()); // 展开分组事件
}
private class OnChildClickListenerImpl implements OnChildClickListener {// 监听子项点击事件
@Override
public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {
int gourpsSum = adapter.getGroupCount();//组的数量
for(int i = 0; i < gourpsSum; i++) {
int childSum = adapter.getChildrenCount(i);//组中子项的数量
for(int k = 0; k < childSum;k++) {
boolean isLast = false;
if (k == (childSum - 1)){
isLast = true;
}
CheckBox cBox = (CheckBox) adapter.getChildView(i, k, isLast, null, null).findViewById(R.id.checkBox);
cBox.toggle();//切换CheckBox状态!!!!!!!!!!
boolean itemIsCheck=cBox.isChecked();
TextView tView=(TextView) adapter.getChildView(i, k, isLast, null, null).findViewById(R.id.textView);
String gameName=tView.getText().toString();
if (i == groupPosition && k == childPosition) {
statusHashMap.put(gameName, itemIsCheck);
} else {
statusHashMap.put(gameName, false);
}
((BaseExpandableListAdapter) adapter).notifyDataSetChanged();//通知数据发生了变化
}
}
return true;
}
}
private class OnGroupClickListenerImpl implements OnGroupClickListener {// 组被点击事件
@Override
public boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id) {
return false;
}
}
private class OnGroupCollapseListenerImpl implements OnGroupCollapseListener {// 组收缩事件
@Override
public void onGroupCollapse(int groupPosition) {
}
}
private class OnGroupExpandListenerImpl implements OnGroupExpandListener {// 打开组事件
@Override
public void onGroupExpand(int groupPosition) {
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo) {// 处理长按事件
}
// 自定义适配器!!!!
private class MyExpandableListAdapter extends BaseExpandableListAdapter {
private Context context = null;
public String[] groups = { "扑克", "麻将" }; // 组名称
public String[][] children = { { "斗地主", "炸金花", "推火车" },{ "四川麻将", "北京麻将", "湖南麻将" } }; // 定义子选项
public MyExpandableListAdapter(Context context) {
this.context = context;
statusHashMap = new HashMap<String, Boolean>();
for (int i = 0; i < children.length; i++) {// 初始时,让所有的子选项均未被选中
for (int a = 0; a < children[i].length; a++) {
statusHashMap.put(children[i][a], false);
}
}
}
@Override
public Object getChild(int groupPosition, int childPosition) { // 取得指定的子项
return this.children[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition) { // 取得子项ID
return childPosition;
}
public TextView buildTextView() { // 自定义方法,建立文本.用于显示组
AbsListView.LayoutParams param = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 35); // 指定布局参数
TextView textView = new TextView(this.context); // 创建TextView
textView.setLayoutParams(param); // 设置布局参数
textView.setTextSize(14.0f); // 设置文字大小
textView.setGravity(Gravity.LEFT); // 左对齐
textView.setPadding(40, 8, 3, 3); // 间距
return textView; // 返回组件
}
//点击事件发生后:先执行事件监听,然后调用此getChildView()
@Override
public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// 返回子项组件
if (convertView == null) {// 第一次的时候convertView是空,所以要生成convertView
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item, null);
}
childTextView = (TextView) convertView.findViewById(R.id.textView);
childTextView.setText(getChild(groupPosition, childPosition).toString());
childBox = (CheckBox) convertView.findViewById(R.id.checkBox);
Boolean nowStatus = statusHashMap.get(children[groupPosition][childPosition]);//当前状态
childBox.setChecked(nowStatus);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) { // 取得子项个数
return this.children[groupPosition].length;
}
@Override
public Object getGroup(int groupPosition) { // 取得组对象
return this.groups[groupPosition];
}
@Override
public int getGroupCount() { // 取得组个数
return this.groups.length;
}
@Override
public long getGroupId(int groupPosition) { // 取得组ID
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// 取得组显示组件
TextView textView = buildTextView(); // 建立组件
textView.setText(this.getGroup(groupPosition).toString()); // 设置文字
return textView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void notifyDataSetChanged() {//通知数据发生变化
super.notifyDataSetChanged();
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}
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"> <ExpandableListView android:id="@+id/elistview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:groupIndicator="@null" /> </LinearLayout>
item.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 注意: 将复选框设置为不可点击,不可在触摸时点击,不可获得焦点 -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="60dip"
/>
<CheckBox
android:id="@+id/checkBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_marginLeft="100dip"
/>
</LinearLayout>