项目中有用到复选框的例子,啊啊......在网上查找有关资料,大多都是过于繁琐,所以自己决定写个这个方面的demo。。。

先给个效果图:

在ListView中添加复选框主要注意以下几个问题:

1、ListView item与item中的控件抢焦点的问题(必须设置CheckBox不可点击和不能获取焦点,让ListView得到焦点)

2、ListView的setChoicMode(int choiceMode)选择模式():有choiceMode : CHOICE_MODE_NONE, CHOICE_MODE_SINGLE, or CHOICE_MODE_MULTIPLE分别是不可选、单选、多选

3、点击ListView item时,反转CheckBox的状态,mCheckBox.toggle();

说到这,可以知道ListView实现复选框的逻辑还是比较简单的,针对第一个问题,为什么需要让CheckBox失去焦点呢?因为像系统默认可点击的控件如Button、CheckBox、ImageButton等或者它们的子控件,相对其它默认不可点击的控件具有更高的优先级,所以在和其它控件一起使用中它们会优先获得焦点,所以如果不设置CheckBox失去焦点,那么ListView就不可点击了,只能点击CheckBox这个控件。

好了,直接贴一下代码吧:

这个方法就是显示一个ListView复选框:

private void showAllAppInfo() {
		View view = LayoutInflater.from(this).inflate(R.layout.show_appinfo,
				null);
		ListView mListView = (ListView) view
				.findViewById(R.id.show_appinfo_listview);
		Button mBtnCancel = (Button) view
				.findViewById(R.id.show_appinfo_cancel);
		Button mBtnSubmit = (Button) view
				.findViewById(R.id.show_appinfo_submit);
		final MyAdapter adapter = new MyAdapter();
		mListView.setAdapter(adapter);
		mListView.setItemsCanFocus(true);// 让item得到焦点,【注意】必须将ListView的item布局中的Checkbox控件失去焦点
		mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);// 设置多选模式
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				ViewHolder holder = (ViewHolder) view.getTag();// 得到当前点击的View的ViewHolder对象
				holder.mCheckBox.toggle();// 当点击时设置相反的状态
				adapter.mCheckBoxSelected.put(position,
						holder.mCheckBox.isChecked());//修改Hashmap中对应位置Checkbox的选中情况
			}
		});
		Display display = getWindowManager().getDefaultDisplay();
		Point outSize = new Point();
		display.getSize(outSize);
		int width = outSize.x;
		int height = outSize.y;
		final PopupWindow pop = new PopupWindow(view, width * 3 / 4,
				height * 4 / 5, true);
		WindowManager.LayoutParams params = getWindow().getAttributes();
		params.alpha = 0.6f;
		getWindow().setAttributes(params);
		mBtnSubmit.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				StringBuffer sb = new StringBuffer();
				for (int i = 0; i < adapter.appInfoList.size(); i++) {
					// 循环遍历集合,得到选择item的信息
					if (adapter.mCheckBoxSelected.get(i)) {
						String selectedAppName = adapter.appInfoList.get(i)
								.getAppName();
						// Drawable selectedAppIcon = adapter.appInfoList.get(i).getAppIcon();
						sb.append(selectedAppName+",");
					}
				}
				pop.dismiss();
				Toast.makeText(getApplicationContext(), sb.toString(),
						Toast.LENGTH_SHORT).show();
			}
		});
		mBtnCancel.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				pop.dismiss();
			}
		});
		pop.setOnDismissListener(new OnDismissListener() {
			@Override
			public void onDismiss() {
				WindowManager.LayoutParams params = getWindow()
						.getAttributes();
				params.alpha = 1.0f;
				getWindow().setAttributes(params);
			}
		});
		pop.setBackgroundDrawable(new BitmapDrawable());
		pop.setOutsideTouchable(true);
		pop.setAnimationStyle(R.style.showPopupAnimation);
		pop.showAtLocation(view, Gravity.CENTER, 0, 0);
	}

重写适配器,Myadapter.java

public class MyAdapter extends BaseAdapter {
		public List<AppInfo> appInfoList;
		public HashMap<Integer, Boolean> mCheckBoxSelected;

		public MyAdapter() {
			appInfoList = getSystemAppInfo();
			mCheckBoxSelected = new HashMap<Integer, Boolean>();
			for (int i = 0; i < appInfoList.size(); i++) {
				mCheckBoxSelected.put(i, false);//初始化, 默认不选中
			}
		}

		@Override
		public int getCount() {
			return appInfoList.size();
		}

		@Override
		public Object getItem(int position) {

			return appInfoList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder viewHolder;
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.listview_item, null, true);
				viewHolder.mImgAppIcon = (ImageView) convertView
						.findViewById(R.id.listview_item_img);
				viewHolder.mTvAppName = (TextView) convertView
						.findViewById(R.id.listview_item_tv);
				viewHolder.mCheckBox = (CheckBox) convertView
						.findViewById(R.id.listview_item_cbx);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			}
			viewHolder.mImgAppIcon.setImageDrawable(appInfoList.get(position)
					.getAppIcon());
			viewHolder.mTvAppName.setText(appInfoList.get(position)
					.getAppName());
			viewHolder.mCheckBox.setChecked(mCheckBoxSelected.get(position));
			return convertView;
		}

	}

ViewHolder类:

public final static class ViewHolder {
		ImageView mImgAppIcon;
		TextView mTvAppName;
		CheckBox mCheckBox;
	}

得到系统内非系统app:

// 得到非系统应用列表
	private List<AppInfo> getSystemAppInfo() {
		List<AppInfo> list = new ArrayList<AppInfo>();
		List<PackageInfo> packages = this.getPackageManager()
				.getInstalledPackages(0);
		AppInfo appInfo = null;
		for (PackageInfo temp : packages) {
			if ((temp.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
				// 非系统应用
				String appName = (String) temp.applicationInfo
						.loadLabel(getPackageManager());
				Drawable appIcon = temp.applicationInfo
						.loadIcon(getPackageManager());
				appInfo = new AppInfo(appIcon, appName);
				list.add(appInfo);
				appInfo = null;
			} else {
				// 系统应用
			}
		}
		return list;
	}


当然还有一个JavaBean类:AppInfo.java,这个类的代码就不贴了。

源码下载请戳:http://download.csdn.net/detail/u010687392/8702343

Android实战之ListView复选框的更多相关文章

  1. android 中单选和复选框监听操作

    单选按钮RadioGroup.复选框CheckBox都有OnCheckedChangeListener事件,我们一起了解一下. package com.genwoxue.oncheckedchange ...

  2. Android 单选按钮(RadioButton)和复选框(CheckBox)的使用

    1.RadioButton (1)介绍 (2)单选按钮点击事件的用法 (3)RadioButton与RadioGroup配合使用实现单选题功能 (4)xml布局及使用 <?xml version ...

  3. Android 开发笔记___复选框__checkbox

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  4. android 密码输入通过复选框实现明文密文显示

    editText1.setTransformationMethod(HideReturnsTransformationMethod.getInstance());//将文本框的内容以明文显示 edit ...

  5. Android课程---单选框与复选框的实现

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...

  6. 3.Android之单选按钮RadioGroup和复选框Checkbox学习

    单选按钮和复选框在实际中经常看到,今天就简单梳理下. 首先,我们在工具中拖进单选按钮RadioGroup和复选框Checkbox,如图: xml对应的源码: <?xml version=&quo ...

  7. 复选框输入Android Studio 如果修改LogCat的颜色,默认全是黑色看着挺不舒服的

    今天一直在查找复选框输入之类的问题,上午正好有机会和大家分享一下. 怎么找到并表现LogCat这里就不需要再讲了吧,主要说一下本篇的主题,如何修改他的颜色 .我们在使用Eclipse的时候应该都用过L ...

  8. Android之单复选框及Spinner实现二级联动

    一.基础学习 1.图形学真的很神奇啊....查了些资料做出了3D云标签,哈哈...其实直接拿来用的,我们要效仿鲁迅先生的拿来主义,嘿嘿~~3D标签云就是做一个球面,然后再球面上取均匀分布的点,把点坐标 ...

  9. 制作带复选框的ListView控件

    实现效果: 知识运用   ListView控件的GridLines //设置是否在ListView控件中显示网格线 public bool GridLines{get;set} 和CheckBoxes ...

随机推荐

  1. [bzoj1187][HNOI2007]神奇游乐园

    来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...

  2. CCA更新流程分析

    1 CCA CCA(空间信道评估)在CSMA/CA中比较非常重要,事关整机吞吐量,所以对其实现进行简单分析.CCA好像应该有2种:CCA-CS,是属于PLCP层的,捕获到能量且能量值高于-82dB后, ...

  3. JS中三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来 ...

  4. 数据结构与算法 —— 链表linked list(05)

    反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 示例 : 给定这个链表:1->2->3->4->5 返回结果: 5->4->3->2 ...

  5. VS2012代码对齐快捷键

    1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了

  6. .net如何引用System.Drawing.Drawing2D 命名空间和System.Drawing.Image及其相关概念

    其实这个很简单,直接在引用那里单击右键选择添加框架,然后找到System.Drawing就OK了, 其实并没有网上所说的那样需要下载什么Drawing.BLL. 首先Syetem.Drawing.Dr ...

  7. 关闭默认共享,禁止ipc$空连接

    关闭默认共享,禁止ipc$空连接 要防止别人用ipc$和默认共享入侵,需要禁止ipc$空连接,避免入侵者取得用户列表,并取消默认共享 禁止ipc$空连接进行枚举运行regedit,找到如下组键[HKE ...

  8. python字典无限遍历

    #无限遍历dict,通过key获取value,嵌套字典存在多个相同的key,可获取多个key class getValues(object): def __init__(self): pass #无限 ...

  9. 无忧代理免费ip爬取(端口js加密)

    起因 为了训练爬虫技能(其实主要还是js技能-),翻了可能有反爬的网站挨个摧残,现在轮到这个网站了:http://www.data5u.com/free/index.shtml 解密过程 打开网站,在 ...

  10. Node.js 模块

    稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...