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 ...
随机推荐
- [bzoj4405][wc2016]挑战NPC
来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个球,用整数1到n编号.还有m个筐子,用整数1到m编号. ...
- SpringCloud学习之Hystrix
一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...
- Java 8 的时间日期 API
上一篇文章『Java 的时间日期 API』中,我们学习了由 Date.Calendar,DateFormat 等组成的「传统时间日期 API」,但是传统的处理接口设计并不是很友好,不易使用.终于,Ja ...
- SSD:TensorFlow中的单次多重检测器
SSD:TensorFlow中的单次多重检测器 SSD Notebook 包含 SSD TensorFlow 的最小示例. 很快,就检测出了两个主要步骤:在图像上运行SSD网络,并使用通用算法(top ...
- [Luogu 1516] 青蛙的约会
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- 浅谈JAVA8引入的接口默认方法
参考 http://blog.csdn.net/wanghao_0206/article/details/52712736 public interface InterfaceTest { publi ...
- SQL AND和OR求值顺序
假如需要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品.下面的SELECT语句使用组合的AND和OR操作符建立了一个WHERE子句: ; 分析▼ 请看上面的结果.返回的行中有4行价 ...
- 两个App之间调起通信
前言 经常使用一些app的分享功能,比如点击QQ分享,就从app打开(跳转到)QQ,然后分享完之后又回到我们的app,那么这是怎样实现的呢? 假设有这么一个需求,由app1跳转到app2,当app2完 ...
- easyui datagrid 动态表头2
前端 function goqry() { $("#form").form("submit", { url: "CJCK_bjcjfx_yfsl.as ...
- jupyter notebook 更换主题的方法
参考 https://github.com/dunovank/jupyter-themes install with pip # install jupyterthemes pip install j ...