`

实现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控件的多选和全选功能实例 Android中ListView控件的多选和全选功能是非常常见的需求,特别是在移动应用中,用户经常需要选择多个项目进行操作。本文将详细介绍Android实现ListView控件的多选和...

    CheckBox实现多选、全选、反选功能

    全选功能的实现,一般需要一个额外的CheckBox作为全选按钮。当全选按钮被选中时,所有列表项的CheckBox都应被选中;反之,全部取消选中。 ```java // 全选按钮的点击事件 selectAllCheckbox....

    WPF ListView控件中CheckBox全选联动

    在WPF应用开发中,ListView控件是一种常用的数据显示控件,它可以用来展示各种类型的数据集合。在实际项目中,我们经常需要实现一个功能,即在ListView中加入CheckBox,让用户能够通过一个主CheckBox来控制所有子项...

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

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

    android listview,ExpandableListView实现单选,多选,全选,edittext实现批量输入.zip

    本项目聚焦于如何在这些组件中实现单选、多选、全选功能,并利用EditText进行批量输入操作。以下是对这些知识点的详细阐述: 1. **ListView与ExpandableListView的区别** - **ListView** 是一个基本的列表视图,每...

    Android 的listView 带checkbox实现多选,全选,反选

    当需要在ListView中添加复选框(CheckBox)来实现多选、全选和反选功能时,需要处理多个技术点。以下是对这个主题的详细解释: 1. **ListView与Adapter**:ListView的工作原理是通过Adapter将数据绑定到视图上。你...

    Android checkbox的listView(多选,全选,反选)具体实现方法

    然而,当需要在ListView中集成CheckBox以便实现多选、全选和反选功能时,开发者往往会遇到一些挑战,因为ListView的复用机制可能导致CheckBox的状态无法正确保存。本文将详细介绍如何在Android中实现一个带有...

    ListView实现多选效果

    当需要在ListView中实现多选功能时,通常会结合使用Checkbox。本教程将详细讲解如何在ListView中实现Checkbox的多选效果,并能动态加载数据,使得用户体验更加完善。 1. **ListView的基本使用** - ListView是一个...

    AndroidListView全选功能,非CheckBox

    `AndroidListView全选功能,非CheckBox`这个主题是关于如何实现ListView中的全选功能,但不使用传统的CheckBox控件。这种实现方式可能是通过自定义Adapter和单个选择状态管理来达到目的。下面将详细介绍这个功能的...

    高仿京东购物车listview_checkbox实现全选

    这个标题所指的示例项目,旨在演示如何使用ListView和CheckBox组件来创建一个类似京东、淘宝购物车的用户界面,并实现全选功能。下面我们将深入探讨这一主题,讲解相关知识点。 首先,`ListView`是Android中的一个...

    android ListView中的checkBox全选和反选Demo

    CheckBox则是用户界面中常见的复选框控件,常用于实现多选功能。本Demo主要探讨如何在ListView中集成CheckBox,实现全选和反选的功能。 一、ListView基础 ListView是Android提供的一个可滚动视图,用于显示一系列的...

    android listview+checkbox实现多选

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。在许多场景下,我们需要在ListView中加入...实际开发中,可能还需要根据具体需求进行调整和优化,例如添加全选/全不选按钮、实现多选对话框等功能。

    listview checkbox 多选反选取消

    总结起来,"listview checkbox 多选反选取消"这个主题涵盖了如何在Android的ListView中结合Checkbox实现多选、反选和取消选择的功能。这涉及到自定义Adapter的编写、CheckBox的状态管理以及事件监听的处理。通过对...

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

    本篇文章将深入探讨如何在ListView中实现CheckBox的多选功能,并记录用户的选定状态。ListView是Android中常用的一个控件,它允许我们以列表的形式展示大量数据,而CheckBox则提供了一种让用户进行多选操作的方式。 ...

    listview内的全选和全部选

    实现ListView内的全选、全不选、单选和多选功能是常见的需求,这涉及到Adapter的使用以及ListView的交互逻辑。以下是对这个主题的详细解释: 1. **ListView的基本原理**:ListView通过复用视图(ViewHolder模式)来...

    ListView中使用单选和多选效果

    在某些应用场景中,我们可能需要实现ListView中的单选或多选功能,例如在创建问卷调查或设置选项时。本篇文章将详细讲解如何在ListView中实现单选和多选效果。 首先,我们需要了解ListView的基本结构。ListView通常...

    listview多选与单选模式demo

    本示例"listview多选与单选模式demo"旨在展示如何在ListView中实现单选和多选功能,这对于开发涉及用户选择操作的应用至关重要。下面我们将深入探讨ListView的这两种模式以及如何在实际项目中实现它们。 一、...

    listview带checkbox全选、取消功能

    在ListView中集成Checkbox控件,可以实现用户对单个或所有项的选择操作,这在很多应用场景中非常常见,比如多选列表、设置选项等。本篇将详细介绍如何在ListView中添加带有全选/取消功能的Checkbox。 首先,我们...

    listview全选、反选、单选、多选、全不选、获取选中数据等.zip

    综上所述,实现ListView的全选、反选、单选、多选、全不选以及获取选中数据等功能,需要对Adapter、数据绑定和事件监听有深入理解。实际开发中,这些功能可以极大地提升用户体验,让应用更具交互性。通过以上步骤,...

Global site tag (gtag.js) - Google Analytics