ListView 自身提供了 CheckBox 只需要添加一行代码

getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

但是这种实现想要自己控制操作起来局限很多。所以我选择了自己添加CheckBox的方式。可以支持列表项的全选,删除,并保持数据的对应关系不会乱。

列表中的CheckBox选中状态与一个Map进行绑定,利用adapter.notifyDataSetChanged();来更新界面。

效果如下:

下面直接看代码把。

main.xml

Java代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:background="#C9F1FF">
  7. <ListView
  8. android:id="@id/android:list"
  9. android:layout_height="wrap_content"
  10. android:layout_width="fill_parent"
  11. android:fadingEdge="none"
  12. android:cacheColorHint="#00000000"/>
  13. <RelativeLayout
  14. android:layout_width="fill_parent"
  15. android:layout_height="40.0dip"
  16. android:layout_alignParentBottom="true">
  17. <CheckBoxandroid:id="@+id/all_check_btn"
  18. android:layout_width="40.0dip"
  19. android:background="@drawable/bottom_back_bg"
  20. android:layout_height="40.0dip"
  21. android:layout_alignParentLeft="true"/>
  22. </RelativeLayout>
  23. </RelativeLayout>

item.xml

Java代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"android:layout_height="wrap_content"
  4. android:layout_marginRight="3.0dip"android:layout_weight="1.0"
  5. android:orientation="horizontal"android:descendantFocusability="blocksDescendants">
  6. <CheckBoxandroid:id="@+id/isCheakBox"android:layout_width="wrap_content"android:layout_height="wrap_content"
  7. android:layout_alignParentLeft="true"/>
  8. <!--日报图片-->
  9. <ImageViewandroid:id="@+id/dailyPic"android:contentDescription="dailyPic"
  10. android:layout_width="wrap_content"android:layout_height="wrap_content"
  11. android:layout_marginTop="3.0dip"android:src="@drawable/reports"
  12. android:layout_toRightOf="@id/isCheakBox"android:layout_centerVertical="true"/>
  13. <!--附件名称-->
  14. <TextView
  15. android:id="@+id/dailyName"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_toRightOf="@id/dailyPic"
  19. android:text="日报名称"android:layout_centerVertical="true"
  20. android:textColor="#000000"
  21. android:textSize="12.0sp"/>
  22. <ImageButtonandroid:id="@+id/deleteAttachment"
  23. android:layout_width="wrap_content"android:layout_height="wrap_content"
  24. android:layout_marginTop="3.0dip"android:background="@drawable/delete"
  25. android:layout_centerVertical="true"android:focusable="false"
  26. android:layout_alignParentRight="true"android:layout_marginRight="20dp"/>
  27. <!--附件名称-->
  28. </RelativeLayout>

Activity代码

Java代码
  1. publicclassListViewCheckBoxActivityextendsListActivity{
  2. privatestaticfinalStringTAG="ListViewCheckBoxActivity";
  3. privateList<Item>itemList;
  4. privateDraftDailyAdapteradapter;
  5. privateMap<Integer,Boolean>isCheckedMap;
  6. privateCheckBoxallCheckBox;
  7. @Override
  8. protectedvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. allCheckBox=(CheckBox)findViewById(R.id.all_check_btn);
  12. itemList=newArrayList<Item>();
  13. isCheckedMap=newHashMap<Integer,Boolean>();
  14. //初始化数据
  15. for(inti=0;i<8;i++){
  16. Itemitem=newItem();
  17. item.id=i;
  18. item.name="第"+i+"篇日报";
  19. itemList.add(item);
  20. isCheckedMap.put(i,false);
  21. }
  22. adapter=newDraftDailyAdapter(this,itemList);
  23. setListAdapter(adapter);
  24. allCheckBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
  25. @Override
  26. publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
  27. Set<Integer>set=isCheckedMap.keySet();
  28. Iterator<Integer>iterator=set.iterator();
  29. if(isChecked){
  30. while(iterator.hasNext()){
  31. IntegerkeyId=iterator.next();
  32. isCheckedMap.put(keyId,true);
  33. }
  34. }else{
  35. while(iterator.hasNext()){
  36. IntegerkeyId=iterator.next();
  37. isCheckedMap.put(keyId,false);
  38. }
  39. }
  40. adapter.notifyDataSetChanged();
  41. }
  42. });
  43. }
  44. classDraftDailyAdapterextendsBaseAdapter{
  45. publicList<Item>list;
  46. privateContextcontext;
  47. LayoutInflaterinflater;
  48. publicDraftDailyAdapter(Contextcontext,List<Item>list){
  49. super();
  50. this.list=list;
  51. this.context=context;
  52. inflater=LayoutInflater.from(this.context);
  53. }
  54. @Override
  55. publicintgetCount(){
  56. returnlist==null?0:list.size();
  57. }
  58. @Override
  59. publicObjectgetItem(intlocation){
  60. returnlist.get(location);
  61. }
  62. @Override
  63. publiclonggetItemId(intposition){
  64. returnposition;
  65. }
  66. @Override
  67. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  68. ViewHolderholder=null;
  69. Itemitem=list.get(position);
  70. //Item的位置
  71. finalintlistPosition=position;
  72. //这个记录item的id用于操作isCheckedMap来更新CheckBox的状态
  73. finalintid=item.id;
  74. if(convertView==null){
  75. holder=newViewHolder();
  76. convertView=inflater.inflate(R.layout.item,null);
  77. holder.tvName=(TextView)convertView.findViewById(R.id.dailyName);
  78. holder.deleteButton=(ImageButton)convertView.findViewById(R.id.deleteAttachment);
  79. holder.cBox=(CheckBox)convertView.findViewById(R.id.isCheakBox);
  80. convertView.setTag(holder);
  81. }else{
  82. holder=(ViewHolder)convertView.getTag();
  83. }
  84. Log.d(TAG,"id="+id);
  85. holder.cBox.setChecked(isCheckedMap.get(id));
  86. holder.tvName.setText(item.name);
  87. holder.deleteButton.setOnClickListener(newOnClickListener(){
  88. @Override
  89. publicvoidonClick(ViewparamView){
  90. //Log.d(TAG,"deletePosition="+listPosition+"");
  91. //删除list中的数据
  92. list.remove(listPosition);
  93. //删除Map中对应选中状态数据
  94. isCheckedMap.remove(id);
  95. //通知列表数据修改
  96. adapter.notifyDataSetChanged();
  97. }
  98. });
  99. holder.cBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
  100. @Override
  101. publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
  102. if(isChecked){
  103. isCheckedMap.put(id,true);
  104. }else{
  105. isCheckedMap.put(id,false);
  106. }
  107. }
  108. });
  109. returnconvertView;
  110. }
  111. publicfinalclassViewHolder{
  112. publicTextViewtvName;
  113. publicImageButtondeleteButton;
  114. publicCheckBoxcBox;
  115. }
  116. }
  117. classItem{
  118. privateIntegerid;
  119. privateStringname;
  120. }
  121. }

资源文件见附件源代码。

  • ListViewCheckBox.rar(179.1 KB)
  • 下载次数: 163
  • 查看图片附件
转自http://hhulijin.iteye.com/blog/1498580

安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)相关推荐

  1. android listview中播放视频,支持全屏

    最近在做项目的时候有需求要在 listView 中播放视频,并且支持横竖屏无缝切换,在网上搜索了一下,关于这种 demo真的很少, 有的也只是实现简单的功能,无法满足项目中的需求,想着修改一下凑合用, ...

  2. Android ListView中CheckBox选中状态失效的最佳解决方案

    Android ListView中CheckBox选中状态失效: 在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快 ...

  3. android UI进阶之实现listview中checkbox的多选与记录

    今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...

  4. ListView中CheckBox使用问题

    因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应. 解决的方法:在C ...

  5. android ListView中CheckBox错位的解决

    貌似已经非常晚了,可是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,但是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并非你选中的,百思不得其解.后面通过上网查资 ...

  6. 笔记56--listview之selector、listview中同一时刻只有一个item能被选中

    notifyDataSetChanged():只会刷新数据,不会刷新控件?比如,控件的显示和隐藏? selector参考:http://dev.10086.cn/cmdn/wiki/index.php ...

  7. 定制ListView的界面(使用自定义的列表项布局,一边显示水果图片,一边显示水果文字)以及ListView的点击事件

    只能显示一段文本的ListView实在是太过单调,我们现在就来对ListView的界面进行定制,让它可以显示更加丰富的内容. 首先,我们需要准备好一组水果图片,分别对应上面提供的每一种水果,待会我们要 ...

  8. 小程序实现item列表左右滑动删除等操作(附源码)

    效果 项目地址: 项目中使用了color-ui的ui库方便样式 https://gitee.com/maxiaodong1996/list.git 一.index.js const app = get ...

  9. 关于安卓listview获得item中的控件问题

    我的程序里面是用到了安卓的listview来显示数据,主要用SimpleAdapter适配器,然而怎么获取listview的item中的控件呢?就如说我这里做了一个显示地址管理. 而让我苦恼的是要怎么 ...

最新文章

  1. python3爬取新浪NBA新闻信息(待完善)
  2. 蓝桥杯-递归求二项式系数值(java)
  3. 程序员,请不要抢系统管理员的饭碗
  4. jquery链式写法 java_jQuery链式操作
  5. 分享-利用VPC防止病毒软件的进入你的windows电脑
  6. 非顺序控制结构的c语言语法是怎样的,流程控制语句:顺序结构和选择结构
  7. js时间对象:获取当前时间(格式化)- 代码篇
  8. 【前端基础知识】chrome安装React Devtools
  9. 【对讲机的那点事】对讲机数字语音加密,保障通信安全
  10. [转载]刘继东:个人知识管理-走出去,请进来
  11. UML在线画图工具ProcessOn
  12. XP桌面背景文件路径
  13. android 反编译去会员,反编译教程
  14. Python 与金融科技2|数据的滑动平均值及多图可视化
  15. python对以后的就业方向_Python的四个就业方向
  16. 实现mac状态栏图标的隐藏
  17. 初级会计最后一个月稳过秘籍
  18. Oracle Database 10g for Windows安装
  19. Qt可拖拽排序表格(类似QQ好友分组排序)
  20. 副业兼职: 在家就可以做的兼职项目推荐

热门文章

  1. NF、$NF、FR、FNR举例说明
  2. 阿里云成为MariaDB基金会白金会员 全球唯一入选云计算公司
  3. java8 list转map
  4. bash编程初体验之if
  5. 浅谈CIVIL 3D
  6. systemd.conf翻译
  7. JQUERY对RADIO,CHECKBOX,SELECT的操作常用方法大全
  8. opengl 坐标的基本变换
  9. 努力培养自己对项目的主人翁意识
  10. Asp.net:DataList分页技术