ExpandableListView结合CheckBox实现单选的完整示例

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>

 

时间: 2024-05-20 15:05:25

ExpandableListView结合CheckBox实现单选的完整示例的相关文章

expandablelistview和checkbox结合使用,复用问题,头疼好几天,大神帮帮忙啊

问题描述 expandablelistview和checkbox结合使用,复用问题,头疼好几天,大神帮帮忙啊 了viewholder复用了,当子项滑出范围,选中的checkbox变为未选中,不过选中的删除时删除是正确的,只是这样重复选择(不知道怎么说),体验不好,头疼好几天了 expandablelistviewadapter代码如下: 关键代码: /* * 解决复用问题的关键代码,那里好像出错了.导致自动让滑出屏幕的checkbox不选,这里 */ if (checkposition!=nul

SeaJS入门教程系列之完整示例(三)

 这篇文章主要介绍了SeaJS入门教程系列之完整示例,演示了一个完整的SeaJS开发例子,需要的朋友可以参考下 一个完整的例子 上文说了那么多,知识点比较分散,所以最后我打算用一个完整的SeaJS例子把这些知识点串起来,方便朋友们归纳回顾.这个例子包含如下文件:   1.index.html--主页面. 2.sea.js--SeaJS脚本. 3.init.js--init模块,入口模块,依赖data.jquery.style三个模块.由主页面载入. 4.data.js--data模块,纯json

easyui tree带checkbox实现单选的简单实例_javascript技巧

实例如下: <ul id="regionTree"></ul> $('#regionTree').tree({ cascadeCheck: false, //onlyLeafCheck: true, checkbox: true, data: [{ "id": 1, "text": "My Documents", "children": [{ "id": 11,

Keras R语言接口正式发布,同时公开20个完整示例

关于keras的介绍 Keras是一个高层神经网络API,为支持快速实验而生,目前主要功能如下: 支持相同的代码无缝跑在CPU或GPU上 对用户友好,易于快速prototype深度学习模型 支持计算机视觉中的卷积网络.序列处理中的循环网络,也支持两种网络的任意组合 支持任意网络架构:多段输入或多段输出模型.层共享.模型共享等.这意味着Keras 本质上适合用于构建任意深度学习模型(从记忆网络到神经图灵机) 兼容多种运行后端,例如TensorFlow.CNTK和 Theano 如果你已经很熟悉Ke

cxf-求CXF对象传递的完整示例

问题描述 求CXF对象传递的完整示例 求CXF对象传递的完整示例 求CXF对象传递的完整示例 求CXF对象传递的完整示例

RatingBar使用完整示例

MainActivity如下: package cc.testratingbar; import android.os.Bundle; import android.widget.RatingBar; import android.widget.RatingBar.OnRatingBarChangeListener; import android.app.Activity; /** * Demo描述: * RatingBar使用完整示例 * 如果要自定义RatingBar更改它的外观,只需要在布

jQuery包裹节点用法完整示例_jquery

本文实例讲述了jQuery包裹节点用法.分享给大家供大家参考,具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="jquery-1.7.2.min.js" type="text/javas

C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient main.c -o main.out -I:指定mysql头文件所在目录(默认去/usr/include目录下寻找所用到的头文件) -L:指定mysql动态库文件所在目录(默认从/usr/lib目录查找) -l:链接libmysqlclient.so动态库 -o:生成的可执行文件名 三.完整示例 //

Android点亮屏幕和解锁完整示例

MainActivity如下: package cc.test.testwakelock; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; /** * Demo描述: * 点亮屏幕和解开键盘锁完整示例 * * 注意权限: * <uses-permission android:name="android.p