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

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

 

主程序代码   MainActivity.java

[java]   view plain copy
  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 plain copy
  1.    
[java]   view plain copy
  1. 继承自BaseAdapter的MyAdapter  
[java]   view plain copy
  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>  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值