Android实战之ListView复选框
项目中有用到复选框的例子,啊啊......在网上查找有关资料,大多都是过于繁琐,所以自己决定写个这个方面的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复选框的更多相关文章
- android 中单选和复选框监听操作
单选按钮RadioGroup.复选框CheckBox都有OnCheckedChangeListener事件,我们一起了解一下. package com.genwoxue.oncheckedchange ...
- Android 单选按钮(RadioButton)和复选框(CheckBox)的使用
1.RadioButton (1)介绍 (2)单选按钮点击事件的用法 (3)RadioButton与RadioGroup配合使用实现单选题功能 (4)xml布局及使用 <?xml version ...
- Android 开发笔记___复选框__checkbox
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- android 密码输入通过复选框实现明文密文显示
editText1.setTransformationMethod(HideReturnsTransformationMethod.getInstance());//将文本框的内容以明文显示 edit ...
- Android课程---单选框与复选框的实现
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- 3.Android之单选按钮RadioGroup和复选框Checkbox学习
单选按钮和复选框在实际中经常看到,今天就简单梳理下. 首先,我们在工具中拖进单选按钮RadioGroup和复选框Checkbox,如图: xml对应的源码: <?xml version=&quo ...
- 复选框输入Android Studio 如果修改LogCat的颜色,默认全是黑色看着挺不舒服的
今天一直在查找复选框输入之类的问题,上午正好有机会和大家分享一下. 怎么找到并表现LogCat这里就不需要再讲了吧,主要说一下本篇的主题,如何修改他的颜色 .我们在使用Eclipse的时候应该都用过L ...
- Android之单复选框及Spinner实现二级联动
一.基础学习 1.图形学真的很神奇啊....查了些资料做出了3D云标签,哈哈...其实直接拿来用的,我们要效仿鲁迅先生的拿来主义,嘿嘿~~3D标签云就是做一个球面,然后再球面上取均匀分布的点,把点坐标 ...
- 制作带复选框的ListView控件
实现效果: 知识运用 ListView控件的GridLines //设置是否在ListView控件中显示网格线 public bool GridLines{get;set} 和CheckBoxes ...
随机推荐
- Python Web学习笔记之多道程序设计技术和操作系统的特性
采用了多道程序设计技术的操作系统具有如下特性 : ① 并发性.它 是指两个或两个以上的事件或活动在同一时间间隔内发生.操作系统是一个并发系统,并发性是它的重要特征,操作系统的并发性指计算机系统中同时存 ...
- 笔记3 装配Bean总结
一.自动化装配bean 1.组件扫描 2.自动装配 CompactDisc.java package Autowiring; public interface CompactDisc { void p ...
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...
- 3.5 find() 判断是否存在某元素
vector 判断是否存在某元素: if(find(A.begin(), A.end(), A[i]) != A.end()){ // 若存在 A[i] // find() 返回一个指针 }
- 2. struct A 和 typedef struct A
2. struct A 和 typedef struct A 2.1 struct A struct A{}定义一个名为struct A的结构体. 下例定义了struct A同时,声明了两个变量(注意 ...
- javascript实现图片的预览
简单javascript代码 实现上传图片预览 <body> <!-- 设置当有图片准备上传时触发javascript代码--> <input type="fi ...
- php序列化漏洞理解
0x01什么是序列化 序列化就是将我们的 对象转变成一个字符串,保存对象的值方便之后的传递与使用. 0x02为什么要序列化 如果为一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有 ...
- 推荐几种PHP实现页面跳转的方法
1.PHP实现页面跳转第一种方法 <?php header("Location:http://www.baidu.com"); ?> header()是php内置函数, ...
- ACM Max Factor
To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) co ...
- 阿里巴巴Java开发规约插件
就在今天 10月14日上午9:00 阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合<手册>的 ...