`

实现ListView控件的多选和全选功能

阅读更多

实现ListView控件的多选和全选功能

 

主程序代码   MainActivity.java

[java] view plaincopy
  1. package yy.test;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.graphics.Color;  
  7. import android.os.Bundle;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.view.SubMenu;  
  11. import android.view.View;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.CheckBox;  
  15. import android.widget.ListAdapter;  
  16. import android.widget.ListView;  
  17. import android.widget.TextView;  
  18. import android.widget.Toast;  
  19.   
  20. public class MainActivity extends Activity {  
  21.     private ListView listView;  
  22.     private MyAdapter adapter;  
  23.     private ArrayList<String> items;    //模拟存储信息的集合  
  24.     private ArrayList<String> checked;  //该集合存储被选中的列表项中的TextView中所显示的字符串  
  25.     private boolean isMultiple = false// 记录是否是多选状态,true为是,false不是  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.         listView = (ListView) findViewById(R.id.listview);  
  31.         items = new ArrayList<String>();  
  32.         items.add("00000");  
  33.         items.add("11111");  
  34.         items.add("22222");  
  35.         items.add("33333");  
  36.         items.add("44444");  
  37.         items.add("55555");  
  38.         items.add("66666");  
  39.         items.add("77777");  
  40.         items.add("88888");  
  41.         items.add("99999");  
  42.         items.add("aaaaa");  
  43.         items.add("bbbbb");  
  44.         items.add("ccccc");  
  45.         items.add("ddddd");  
  46.         adapter = new MyAdapter(items,this);  //new出自定义的MyAdapter对象  
  47.         listView.setAdapter(adapter);  
  48.           
  49.           
  50.         listView.setOnItemClickListener(new OnItemClickListener() {  
  51.   
  52.             @Override  
  53.             public void onItemClick(AdapterView<?> arg0, View view, int position,  
  54.                     long arg3) {  
  55.                 if(isMultiple){  
  56.                     CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);  
  57.                     TextView textView = (TextView) view.findViewById(R.id.text);  
  58.                     if(checkBox.isChecked()){  
  59.                         checkBox.setChecked(false);  
  60.                         adapter.checkedMap.put(position, false);  
  61.                         textView.setTextColor(Color.WHITE);  
  62.                         adapter.colorMap.put(position, Color.WHITE);  
  63.                         int index = checked.indexOf(textView.getText()+"");  
  64.                         checked.remove(index);  
  65.                           
  66.                     }else{  
  67.                         checkBox.setChecked(true);  
  68.                         adapter.checkedMap.put(position, true);  
  69.                         textView.setTextColor(Color.RED);  
  70.                         adapter.colorMap.put(position, Color.RED);  
  71.                         checked.add(textView.getText()+"");  
  72.                           
  73.                     }  
  74.                 }  
  75.             }  
  76.         });  
  77.     }  
  78.     @Override  
  79.     public boolean onCreateOptionsMenu(Menu menu) {  
  80.         SubMenu subMenu = menu.addSubMenu("操作");  
  81.         subMenu.add(010"多选");  
  82.         subMenu.add(020"删除");  
  83.         subMenu.add(030"全选");  
  84.         subMenu.add(040"取消全选");  
  85.         return super.onCreateOptionsMenu(menu);  
  86.     }  
  87.     @Override  
  88.     public boolean onOptionsItemSelected(MenuItem item) {  
  89.         if(item.getItemId()==1){  
  90.             isMultiple = true;  
  91.             checked = new ArrayList<String>();  
  92.             int index = adapter.getCount();  
  93.             for(int i=0;i<index;i++){  
  94.                 adapter.visibleMap.put(i, CheckBox.VISIBLE);  
  95.             }  
  96.             adapter.notifyDataSetChanged();  
  97.         }else if(item.getItemId()==2){  
  98.             for(String text : checked){  
  99.                 int index = items.indexOf(text);  
  100.                 items.remove(index);  
  101.                   
  102.             }  
  103.             isMultiple = false;  
  104.             adapter = new MyAdapter(items,MainActivity.this);  
  105.             listView.setAdapter(adapter);  
  106.               
  107.         }else if(item.getItemId()==3){  
  108.             isMultiple = true;  
  109.             checked = new ArrayList<String>();  
  110.             int index = adapter.getCount();  
  111.             for(int i=0;i<index;i++){  
  112.                 adapter.checkedMap.put(i, true);  
  113.                 adapter.colorMap.put(i, Color.RED);  
  114.                 adapter.visibleMap.put(i, CheckBox.VISIBLE);  
  115.                 View view1 = adapter.getView(i, nullnull);  
  116.                 TextView textView = (TextView) view1.findViewById(R.id.text);  
  117.                 textView.setTextColor(Color.RED);  
  118.                 /*CheckBox checkBox = (CheckBox) view1.findViewById(R.id.checkbox); 
  119.                 checkBox.setVisibility(CheckBox.VISIBLE);*/  
  120.                 adapter.notifyDataSetChanged();  
  121.                 checked.add(textView.getText()+"");  
  122.             }  
  123.               
  124.         }else if(item.getItemId()==4){  
  125.             isMultiple = false;  
  126.             checked = null;  
  127.             int index = adapter.getCount();  
  128.             for(int i=0;i<index;i++){  
  129.                 adapter.checkedMap.put(i, false);  
  130.                 adapter.colorMap.put(i, Color.WHITE);  
  131.                 adapter.visibleMap.put(i, CheckBox.INVISIBLE);  
  132.                 /*View view1 = adapter.getView(i, null, null); 
  133.                 TextView textView = (TextView) view1.findViewById(R.id.text); 
  134.                 textView.setTextColor(Color.WHITE); 
  135.                 CheckBox checkBox = (CheckBox) view1.findViewById(R.id.checkbox); 
  136.                 checkBox.setVisibility(CheckBox.INVISIBLE);*/  
  137.                 adapter.notifyDataSetChanged();  
  138.                   
  139.             }  
  140.         }  
  141.         return super.onOptionsItemSelected(item);  
  142.     }     
  143. }  
[java] view plaincopy
  1.    
[java] view plaincopy
  1. 继承自BaseAdapter的MyAdapter  
[java] view plaincopy
  1. <pre class="java" name="code">package yy.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import android.content.Context;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.BitmapFactory;  
  10. import android.graphics.Color;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.CheckBox;  
  16. import android.widget.ImageView;  
  17. import android.widget.TextView;  
  18.   
  19. public class MyAdapter extends BaseAdapter {  
  20.   
  21.     private LayoutInflater inflater;  
  22.     private ArrayList<String> items;  
  23.     private Bitmap icon;  
  24.     private Context context;  
  25.     public Map<Integer,Boolean> checkedMap;   //保存checkbox是否被选中的状态  
  26.     public Map<Integer,Integer> colorMap;     //保存textview中文字的状态  
  27.     public Map<Integer,Integer> visibleMap;   //保存checkbox是否显示的状态  
  28.       
  29.     public MyAdapter(ArrayList<String> items, Context context) {  
  30.         super();  
  31.         this.items = items;  
  32.         this.context = context;  
  33.         inflater = LayoutInflater.from(context);  
  34.         icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);  
  35.         checkedMap = new HashMap<Integer, Boolean>();  
  36.         colorMap = new HashMap<Integer, Integer>();  
  37.         visibleMap = new HashMap<Integer, Integer>();  
  38.         for(int i=0;i<items.size();i++){  
  39.             checkedMap.put(i, false);  
  40.             colorMap.put(i, Color.WHITE);  
  41.             visibleMap.put(i, CheckBox.INVISIBLE);  
  42.         }  
  43.     }  
  44.   
  45.     @Override  
  46.     public int getCount() {  
  47.         // TODO Auto-generated method stub  
  48.         return items.size();  
  49.     }  
  50.   
  51.     @Override  
  52.     public Object getItem(int arg0) {  
  53.         // TODO Auto-generated method stub  
  54.         return arg0;  
  55.     }  
  56.   
  57.     @Override  
  58.     public long getItemId(int arg0) {  
  59.         // TODO Auto-generated method stub  
  60.         return arg0;  
  61.     }  
  62.   
  63.     @Override  
  64.     public View getView(int position, View view, ViewGroup arg2) {  
  65.         view = inflater.inflate(R.layout.file_row, null);  
  66.         ImageView image = (ImageView) view.findViewById(R.id.icon);  
  67.         TextView text = (TextView) view.findViewById(R.id.text);  
  68.         CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);  
  69.         checkBox.setVisibility(visibleMap.get(position));  
  70.         checkBox.setChecked(checkedMap.get(position));  
  71.         image.setImageBitmap(icon);  
  72.         text.setText(items.get(position));  
  73.         text.setTextColor(colorMap.get(position));  
  74.         return view;  
  75.     }  
  76.   
  77. }  
  78. </pre><br>  
  79. <pre></pre>  
  80. <pre class="java" name="code">主界面的布局文件</pre><pre class="java" name="code"><?xml version="1.0" encoding="utf-8"?>  
  81. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  82.     android:orientation="vertical"  
  83.     android:layout_width="fill_parent"  
  84.     android:layout_height="fill_parent"  
  85.     >  
  86.     <ListView    
  87.     android:id="@+id/listview"  
  88.     android:layout_width="fill_parent"   
  89.     android:layout_height="wrap_content"   
  90.     />  
  91. </LinearLayout></pre><pre class="java" name="code"> </pre>  
  92. <p>MyAdapter中所使用的布局文件</p>  
  93. <pre class="java" name="code"><?xml version="1.0" encoding="utf-8"?>  
  94. <LinearLayout  
  95.   xmlns:android="http://schemas.android.com/apk/res/android"  
  96.   android:orientation="horizontal"  
  97.   android:layout_width="fill_parent"  
  98.   android:layout_height="wrap_content"  
  99.   android:layout_gravity="center_vertical"  
  100.   >  
  101.   <ImageView  
  102.   android:id="@+id/icon"  
  103.   android:layout_width="30dp"  
  104.   android:layout_height="30dp"  
  105.   android:layout_gravity="center_vertical"  
  106.   />  
  107.   <TextView  
  108.   android:id="@+id/text"  
  109.   android:layout_width="80dp"  
  110.   android:layout_height="wrap_content"  
  111.   android:layout_gravity="center_vertical"  
  112.   android:paddingLeft="5dp"  
  113.   />  
  114.   <CheckBox  
  115.   android:id="@+id/checkbox"  
  116.   android:layout_width="wrap_content"  
  117.   android:layout_height="wrap_content"  
  118.   android:focusable="false"  
  119.   android:clickable="false"  
  120.   android:focusableInTouchMode="false"  
  121.     
  122.   />  
  123. </LinearLayout>  
  124. </pre>  
  125. <p> </p>  
  126. <p>下面来分析为什么要用map来保存checkbox以及textview的状态。<br>  
  127. <br>  
  128. 这个与ListView的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。<span style="font-family:Courier New; background-color:#f0f0f0"></span></p>  
  129. <pre class="java" name="code"></pre><p> </p>  

 

分享到:
评论

相关推荐

    Android实现ListView控件的多选和全选功能实例

    主要介绍了Android实现ListView控件的多选和全选功能,结合实例形式分析了ListView控件多选及全选功能的布局与功能实现技巧,需要的朋友可以参考下

    VB实现Listview全选、多选功能.rar

    VB实现Listview全癣取消全癣多选功能,弹出提示式多选功能,用ListView将读取到的本地磁盘列表显示在内,然后在每行数据的前边增加一个选择框,用户通过这个复选框可实现对Listview内容的单癣多选功能,我觉得这是个...

    WPF ListView控件中CheckBox全选联动

    WPF 使用MVVM设计模式对进行增删改操作 具体内容可以看我的博客:https://blog.csdn.net/Dear200892/article/details/78849632

    Android 实现自定义多级树控件和全选与反选的效果

    对于多级树的显示其实就是通过数据中各个节点的关系,通过不同的缩进来达到树的效果。而数据中主要要把握id,父节点pId,name的关系,来显示其效果。实例详细的实现的多级树和全选与反选的过程

    WinCE开发中如何为数据列表添加CheckBox列

    在WinCE开发中遇到了问题,如何为DataGrid绑定一列CheckBox列,使数据可以多选全选操作!经过试验发现在WinCE中DataGrid的功能比较弱,无法实现自定义控件!后来发现ListView可以增加一个选择按钮的属性,就改用将...

    安卓源码包android web应用OCR图像识别listview相关EditText输入框Launcher 桌面45个合集

    实现 全选 、 全不选 、 删除等功能.rar [四次元]ListView停止滚动开启下载图片.zip [四次元]Listview分页加载数据.rar [四次元]ListView多级展示,item由对象Leaf提供数据,可设置多个控件.zip [四次元]listview...

    Xamarin.Forms.MultiSelectListView:使用xamarin.forms在列表视图中选择多行

    默认情况下,listview控件使您一次只能选择一行。 MultiSelectListView控件使用修改后的ObservableCollection标记已选择的行。 您可以使用任何图像标记选定的行。 这是组件,可在iOS,Android和UWP上运行。 NuGet...

    全选或删除的列表功能等

    全选或删除的列表功能等,本屌花了一天的时间,写出的这个控件,基本实现了大部分需求,完成的功能如下:1. ListView + CheckBox 布局 2. 多选 3. 删除 4. 可控每项可删和不可删,这个功能看起来简单,其实可不简单哦。

    《程序天下:JavaScript实例自学手册》光盘源码

    21.5 使用DOM实现控件的复制 21.6 使用DOM判断页面中控件是否嵌套 21.7 使用DOM获取页面中某控件的属性 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 拖动表格行改变顺序 21.12 表格...

    程序天下:JavaScript实例自学手册

    21.4 使用DOM实现控件的替换 21.5 使用DOM实现控件的复制 21.6 使用DOM判断页面中控件是否嵌套 21.7 使用DOM获取页面中某控件的属性 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 ...

Global site tag (gtag.js) - Google Analytics