安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)
ListView 自身提供了 CheckBox 只需要添加一行代码
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
但是这种实现想要自己控制操作起来局限很多。所以我选择了自己添加CheckBox的方式。可以支持列表项的全选,删除,并保持数据的对应关系不会乱。
列表中的CheckBox选中状态与一个Map进行绑定,利用adapter.notifyDataSetChanged();来更新界面。
效果如下:
下面直接看代码把。
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#C9F1FF">
- <ListView
- android:id="@id/android:list"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:fadingEdge="none"
- android:cacheColorHint="#00000000"/>
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="40.0dip"
- android:layout_alignParentBottom="true">
- <CheckBoxandroid:id="@+id/all_check_btn"
- android:layout_width="40.0dip"
- android:background="@drawable/bottom_back_bg"
- android:layout_height="40.0dip"
- android:layout_alignParentLeft="true"/>
- </RelativeLayout>
- </RelativeLayout>
item.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"android:layout_height="wrap_content"
- android:layout_marginRight="3.0dip"android:layout_weight="1.0"
- android:orientation="horizontal"android:descendantFocusability="blocksDescendants">
- <CheckBoxandroid:id="@+id/isCheakBox"android:layout_width="wrap_content"android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"/>
- <!--日报图片-->
- <ImageViewandroid:id="@+id/dailyPic"android:contentDescription="dailyPic"
- android:layout_width="wrap_content"android:layout_height="wrap_content"
- android:layout_marginTop="3.0dip"android:src="@drawable/reports"
- android:layout_toRightOf="@id/isCheakBox"android:layout_centerVertical="true"/>
- <!--附件名称-->
- <TextView
- android:id="@+id/dailyName"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/dailyPic"
- android:text="日报名称"android:layout_centerVertical="true"
- android:textColor="#000000"
- android:textSize="12.0sp"/>
- <ImageButtonandroid:id="@+id/deleteAttachment"
- android:layout_width="wrap_content"android:layout_height="wrap_content"
- android:layout_marginTop="3.0dip"android:background="@drawable/delete"
- android:layout_centerVertical="true"android:focusable="false"
- android:layout_alignParentRight="true"android:layout_marginRight="20dp"/>
- <!--附件名称-->
- </RelativeLayout>
Activity代码
- publicclassListViewCheckBoxActivityextendsListActivity{
- privatestaticfinalStringTAG="ListViewCheckBoxActivity";
- privateList<Item>itemList;
- privateDraftDailyAdapteradapter;
- privateMap<Integer,Boolean>isCheckedMap;
- privateCheckBoxallCheckBox;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- allCheckBox=(CheckBox)findViewById(R.id.all_check_btn);
- itemList=newArrayList<Item>();
- isCheckedMap=newHashMap<Integer,Boolean>();
- //初始化数据
- for(inti=0;i<8;i++){
- Itemitem=newItem();
- item.id=i;
- item.name="第"+i+"篇日报";
- itemList.add(item);
- isCheckedMap.put(i,false);
- }
- adapter=newDraftDailyAdapter(this,itemList);
- setListAdapter(adapter);
- allCheckBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
- @Override
- publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
- Set<Integer>set=isCheckedMap.keySet();
- Iterator<Integer>iterator=set.iterator();
- if(isChecked){
- while(iterator.hasNext()){
- IntegerkeyId=iterator.next();
- isCheckedMap.put(keyId,true);
- }
- }else{
- while(iterator.hasNext()){
- IntegerkeyId=iterator.next();
- isCheckedMap.put(keyId,false);
- }
- }
- adapter.notifyDataSetChanged();
- }
- });
- }
- classDraftDailyAdapterextendsBaseAdapter{
- publicList<Item>list;
- privateContextcontext;
- LayoutInflaterinflater;
- publicDraftDailyAdapter(Contextcontext,List<Item>list){
- super();
- this.list=list;
- this.context=context;
- inflater=LayoutInflater.from(this.context);
- }
- @Override
- publicintgetCount(){
- returnlist==null?0:list.size();
- }
- @Override
- publicObjectgetItem(intlocation){
- returnlist.get(location);
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder=null;
- Itemitem=list.get(position);
- //Item的位置
- finalintlistPosition=position;
- //这个记录item的id用于操作isCheckedMap来更新CheckBox的状态
- finalintid=item.id;
- if(convertView==null){
- holder=newViewHolder();
- convertView=inflater.inflate(R.layout.item,null);
- holder.tvName=(TextView)convertView.findViewById(R.id.dailyName);
- holder.deleteButton=(ImageButton)convertView.findViewById(R.id.deleteAttachment);
- holder.cBox=(CheckBox)convertView.findViewById(R.id.isCheakBox);
- convertView.setTag(holder);
- }else{
- holder=(ViewHolder)convertView.getTag();
- }
- Log.d(TAG,"id="+id);
- holder.cBox.setChecked(isCheckedMap.get(id));
- holder.tvName.setText(item.name);
- holder.deleteButton.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(ViewparamView){
- //Log.d(TAG,"deletePosition="+listPosition+"");
- //删除list中的数据
- list.remove(listPosition);
- //删除Map中对应选中状态数据
- isCheckedMap.remove(id);
- //通知列表数据修改
- adapter.notifyDataSetChanged();
- }
- });
- holder.cBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
- @Override
- publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
- if(isChecked){
- isCheckedMap.put(id,true);
- }else{
- isCheckedMap.put(id,false);
- }
- }
- });
- returnconvertView;
- }
- publicfinalclassViewHolder{
- publicTextViewtvName;
- publicImageButtondeleteButton;
- publicCheckBoxcBox;
- }
- }
- classItem{
- privateIntegerid;
- privateStringname;
- }
- }
资源文件见附件源代码。
- ListViewCheckBox.rar(179.1 KB)
- 下载次数: 163
- 查看图片附件
安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)相关推荐
- android listview中播放视频,支持全屏
最近在做项目的时候有需求要在 listView 中播放视频,并且支持横竖屏无缝切换,在网上搜索了一下,关于这种 demo真的很少, 有的也只是实现简单的功能,无法满足项目中的需求,想着修改一下凑合用, ...
- Android ListView中CheckBox选中状态失效的最佳解决方案
Android ListView中CheckBox选中状态失效: 在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快 ...
- android UI进阶之实现listview中checkbox的多选与记录
今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...
- ListView中CheckBox使用问题
因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应. 解决的方法:在C ...
- android ListView中CheckBox错位的解决
貌似已经非常晚了,可是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,但是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并非你选中的,百思不得其解.后面通过上网查资 ...
- 笔记56--listview之selector、listview中同一时刻只有一个item能被选中
notifyDataSetChanged():只会刷新数据,不会刷新控件?比如,控件的显示和隐藏? selector参考:http://dev.10086.cn/cmdn/wiki/index.php ...
- 定制ListView的界面(使用自定义的列表项布局,一边显示水果图片,一边显示水果文字)以及ListView的点击事件
只能显示一段文本的ListView实在是太过单调,我们现在就来对ListView的界面进行定制,让它可以显示更加丰富的内容. 首先,我们需要准备好一组水果图片,分别对应上面提供的每一种水果,待会我们要 ...
- 小程序实现item列表左右滑动删除等操作(附源码)
效果 项目地址: 项目中使用了color-ui的ui库方便样式 https://gitee.com/maxiaodong1996/list.git 一.index.js const app = get ...
- 关于安卓listview获得item中的控件问题
我的程序里面是用到了安卓的listview来显示数据,主要用SimpleAdapter适配器,然而怎么获取listview的item中的控件呢?就如说我这里做了一个显示地址管理. 而让我苦恼的是要怎么 ...
最新文章
- python3爬取新浪NBA新闻信息(待完善)
- 蓝桥杯-递归求二项式系数值(java)
- 程序员,请不要抢系统管理员的饭碗
- jquery链式写法 java_jQuery链式操作
- 分享-利用VPC防止病毒软件的进入你的windows电脑
- 非顺序控制结构的c语言语法是怎样的,流程控制语句:顺序结构和选择结构
- js时间对象:获取当前时间(格式化)- 代码篇
- 【前端基础知识】chrome安装React Devtools
- 【对讲机的那点事】对讲机数字语音加密,保障通信安全
- [转载]刘继东:个人知识管理-走出去,请进来
- UML在线画图工具ProcessOn
- XP桌面背景文件路径
- android 反编译去会员,反编译教程
- Python 与金融科技2|数据的滑动平均值及多图可视化
- python对以后的就业方向_Python的四个就业方向
- 实现mac状态栏图标的隐藏
- 初级会计最后一个月稳过秘籍
- Oracle Database 10g for Windows安装
- Qt可拖拽排序表格(类似QQ好友分组排序)
- 副业兼职: 在家就可以做的兼职项目推荐