Android 长按Listview显示CheckBox,实现批量删除

来源:互联网 发布:java简单项目 编辑:程序博客网 时间:2024/06/07 09:30
ListView实现的列表,如果长按某一个Item,可以显示右边隐藏的CheckBox,从而实现批量删除的功能。效果如图所示。


在网上看到一篇博客:Android 长按Listview显示CheckBox,实现批量删除。但是长按ListView的某一个Item后,其Item的CheckBox并未被选中,需要重新选择。

这篇博客虽然实现了长按ListView显示CheckBox并能批量删除的功能,但是用户体验并不让我满意,所以参考该博文,自己动手写了个项目。

在长按ListView的时候,长按的Item中的CheckBox会被选中,不用重新选择。之后可以继续选择其他Item的CheckBox,并实现了批量删除的功能。

自己写的例子,并未进行完善的测试,如有bug,欢迎指出。


实现思路如下:

1、在ListView的Item布局中放入CheckBox,设置其属性为不可见。新建一个list_delete,用来记录有哪些Item被选中。设置一个标识位isMultiSelect,记录是否处于多选状态。

2、在长按的时候,根据长按Item的position重新加载ListView的适配器,显示出CheckBox,根绝position将长按的Item的CheckBox设为选中状态。并将isMultiSelect设置为true。

3、处于多选状态时(isMultiSelect为true),当点击别的Item,将其数据添加到list_delete中,并勾选上相应的CheckBox。

4、底部的删除,撤销按钮也是在多选状态时才显示。点击删除时,遍历比较list_delete与数据源中的数据,相同的则从数据源中移除。完成后重新显示数据源。


具体实现代码如下:

主页面布局:

主页面布局包含一个ListView和一个隐藏布局,隐藏布局里有两个Button和一个TextView,其visibility属性默认为gone,当监听到长按事件时显示。

[html] view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="0dp"  
  10.         android:layout_weight="1" >  
  11.     </ListView>  
  12.   
  13.     <LinearLayout  
  14.         android:id="@+id/linearLayout"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:orientation="horizontal"  
  18.         android:visibility="gone" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/bt_cancel"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="取消选择" />  
  25.   
  26.         <TextView  
  27.             android:id="@+id/tv_sum"  
  28.             android:layout_width="0dp"  
  29.             android:layout_height="wrap_content"  
  30.             android:layout_weight="1"  
  31.             android:gravity="center"  
  32.             android:text="共计" />  
  33.   
  34.         <Button  
  35.             android:id="@+id/bt_delete"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:text="删除" />  
  39.     </LinearLayout>  
  40.   
  41. </LinearLayout>  
[html] view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="0dp"  
  10.         android:layout_weight="1" >  
  11.     </ListView>  
  12.   
  13.     <LinearLayout  
  14.         android:id="@+id/linearLayout"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:orientation="horizontal"  
  18.         android:visibility="gone" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/bt_cancel"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="取消选择" />  
  25.   
  26.         <TextView  
  27.             android:id="@+id/tv_sum"  
  28.             android:layout_width="0dp"  
  29.             android:layout_height="wrap_content"  
  30.             android:layout_weight="1"  
  31.             android:gravity="center"  
  32.             android:text="共计" />  
  33.   
  34.         <Button  
  35.             android:id="@+id/bt_delete"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:text="删除" />  
  39.     </LinearLayout>  
  40.   
  41. </LinearLayout>  


ListView中Item的布局:

包含一个TextView和一个隐藏的CheckBox,当监听到长按事件时,CheckBox显示,注意事项请看代码中的注释

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tv_name"  
  9.         android:layout_width="0dp"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_weight="1"  
  12.         android:textSize="30sp" />  
  13.   
  14.     <!--  
  15.     CheckBox的clickable属性要设置为false  
  16.     否则点击CheckBox只会触发它自己的事件  
  17.     不会触发ListView中Item的点击事件  
  18.     -->  
  19.   
  20.     <CheckBox  
  21.         android:id="@+id/cb_select"  
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.         android:clickable="false"  
  25.         android:visibility="invisible" />  
  26.   
  27. </LinearLayout>  
[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tv_name"  
  9.         android:layout_width="0dp"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_weight="1"  
  12.         android:textSize="30sp" />  
  13.   
  14.     <!--  
  15.     CheckBox的clickable属性要设置为false  
  16.     否则点击CheckBox只会触发它自己的事件  
  17.     不会触发ListView中Item的点击事件  
  18.     -->  
  19.   
  20.     <CheckBox  
  21.         android:id="@+id/cb_select"  
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.         android:clickable="false"  
  25.         android:visibility="invisible" />  
  26.   
  27. </LinearLayout>  

MainActivity代码:

注意事项请看代码中的注释

[java] view plain copy
  1. package com.example.listviewitemmulselect;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import android.os.Bundle;  
  8. import android.annotation.SuppressLint;  
  9. import android.app.Activity;  
  10. import android.content.Context;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.view.View.OnLongClickListener;  
  15. import android.view.ViewGroup;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.Button;  
  18. import android.widget.CheckBox;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.ListView;  
  21. import android.widget.TextView;  
  22.   
  23. public class MainActivity extends Activity implements OnClickListener {  
  24.   
  25.     private static final int NOSELECT_STATE = -1;// 表示未选中任何CheckBox  
  26.   
  27.     private ListView listView;  
  28.     private Button bt_cancel, bt_delete;  
  29.     private TextView tv_sum;  
  30.     private LinearLayout linearLayout;  
  31.   
  32.     private List<String> list = new ArrayList<String>();// 数据  
  33.     private List<String> list_delete = new ArrayList<String>();// 需要删除的数据  
  34.     private boolean isMultiSelect = false;// 是否处于多选状态  
  35.   
  36.     private MyAdapter adapter;// ListView的Adapter  
  37.   
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.activity_main);  
  42.   
  43.         listView = (ListView) findViewById(R.id.listView1);  
  44.         bt_cancel = (Button) findViewById(R.id.bt_cancel);  
  45.         bt_delete = (Button) findViewById(R.id.bt_delete);  
  46.         tv_sum = (TextView) findViewById(R.id.tv_sum);  
  47.         linearLayout = (LinearLayout) findViewById(R.id.linearLayout);  
  48.         bt_cancel.setOnClickListener(this);  
  49.         bt_delete.setOnClickListener(this);  
  50.   
  51.         // 设置初始数据  
  52.         list = new ArrayList<String>();  
  53.         for (int i = 0; i < 20; i++) {  
  54.             String str = "Item" + i;  
  55.             list.add(str);  
  56.         }  
  57.   
  58.         // 未选中任何Item,position设置为-1  
  59.         adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  60.         listView.setAdapter(adapter);  
  61.     }  
  62.   
  63.     private class MyAdapter extends BaseAdapter {  
  64.   
  65.         private List<String> list;  
  66.         private LayoutInflater inflater;  
  67.   
  68.         private HashMap<Integer, Integer> isCheckBoxVisible;// 用来记录是否显示checkBox  
  69.         private HashMap<Integer, Boolean> isChecked;// 用来记录是否被选中  
  70.   
  71.         @SuppressLint("UseSparseArrays")  
  72.         public MyAdapter(Context context, List<String> list, int position) {  
  73.             inflater = LayoutInflater.from(context);  
  74.             this.list = list;  
  75.             isCheckBoxVisible = new HashMap<Integer, Integer>();  
  76.             isChecked = new HashMap<Integer, Boolean>();  
  77.             // 如果处于多选状态,则显示CheckBox,否则不显示  
  78.             if (isMultiSelect) {  
  79.                 for (int i = 0; i < list.size(); i++) {  
  80.                     isCheckBoxVisible.put(i, CheckBox.VISIBLE);  
  81.                     isChecked.put(i, false);  
  82.                 }  
  83.             } else {  
  84.                 for (int i = 0; i < list.size(); i++) {  
  85.                     isCheckBoxVisible.put(i, CheckBox.INVISIBLE);  
  86.                     isChecked.put(i, false);  
  87.                 }  
  88.             }  
  89.   
  90.             // 如果长按Item,则设置长按的Item中的CheckBox为选中状态  
  91.             if (isMultiSelect && position >= 0) {  
  92.                 isChecked.put(position, true);  
  93.             }  
  94.         }  
  95.   
  96.         @Override  
  97.         public int getCount() {  
  98.             // TODO Auto-generated method stub  
  99.             return list.size();  
  100.         }  
  101.   
  102.         @Override  
  103.         public Object getItem(int position) {  
  104.             // TODO Auto-generated method stub  
  105.             return list.get(position);  
  106.         }  
  107.   
  108.         @Override  
  109.         public long getItemId(int position) {  
  110.             // TODO Auto-generated method stub  
  111.             return position;  
  112.         }  
  113.   
  114.         @Override  
  115.         public View getView(int position, View convertView, ViewGroup parent) {  
  116.             final ViewHolder viewHolder;  
  117.             if (convertView == null) {  
  118.                 viewHolder = new ViewHolder();  
  119.                 convertView = inflater.inflate(R.layout.item_layout, null);  
  120.                 viewHolder.tv_Name = (TextView) convertView.findViewById(R.id.tv_name);  
  121.                 viewHolder.cb = (CheckBox) convertView.findViewById(R.id.cb_select);  
  122.                 convertView.setTag(viewHolder);  
  123.             } else {  
  124.                 viewHolder = (ViewHolder) convertView.getTag();  
  125.             }  
  126.             final String str = list.get(position);  
  127.             viewHolder.tv_Name.setText(str);  
  128.             // 根据position设置CheckBox是否可见,是否选中  
  129.             viewHolder.cb.setChecked(isChecked.get(position));  
  130.             viewHolder.cb.setVisibility(isCheckBoxVisible.get(position));  
  131.             // ListView每一个Item的长按事件  
  132.             convertView.setOnLongClickListener(new onMyLongClick(position, list));  
  133.             /* 
  134.              * 在ListView中点击每一项的处理 
  135.              * 如果CheckBox未选中,则点击后选中CheckBox,并将数据添加到list_delete中 
  136.              * 如果CheckBox选中,则点击后取消选中CheckBox,并将数据从list_delete中移除 
  137.              */  
  138.             convertView.setOnClickListener(new OnClickListener() {  
  139.   
  140.                 @Override  
  141.                 public void onClick(View v) {  
  142.                     // 处于多选模式  
  143.                     if (isMultiSelect) {  
  144.                         if (viewHolder.cb.isChecked()) {  
  145.                             viewHolder.cb.setChecked(false);  
  146.                             list_delete.remove(str);  
  147.                         } else {  
  148.                             viewHolder.cb.setChecked(true);  
  149.                             list_delete.add(str);  
  150.                         }  
  151.                         tv_sum.setText("共选择了" + list_delete.size() + "项");  
  152.                     }  
  153.                 }  
  154.             });  
  155.             return convertView;  
  156.         }  
  157.   
  158.         class ViewHolder {  
  159.             public TextView tv_Name;  
  160.             public CheckBox cb;  
  161.         }  
  162.   
  163.         // 自定义长按事件  
  164.         class onMyLongClick implements OnLongClickListener {  
  165.   
  166.             private int position;  
  167.             private List<String> list;  
  168.   
  169.             // 获取数据,与长按Item的position  
  170.             public onMyLongClick(int position, List<String> list) {  
  171.                 this.position = position;  
  172.                 this.list = list;  
  173.             }  
  174.   
  175.             // 在长按监听时候,切记将监听事件返回ture  
  176.             @Override  
  177.             public boolean onLongClick(View v) {  
  178.                 isMultiSelect = true;  
  179.                 list_delete.clear();  
  180.                 // 添加长按Item到删除数据list中  
  181.                 list_delete.add(list.get(position));  
  182.                 linearLayout.setVisibility(View.VISIBLE);  
  183.                 tv_sum.setText("共选择了" + list_delete.size() + "项");  
  184.                 for (int i = 0; i < list.size(); i++) {  
  185.                     adapter.isCheckBoxVisible.put(i, CheckBox.VISIBLE);  
  186.                 }  
  187.                 // 根据position,设置ListView中对应的CheckBox为选中状态  
  188.                 adapter = new MyAdapter(MainActivity.this, list, position);  
  189.                 listView.setAdapter(adapter);  
  190.                 return true;  
  191.             }  
  192.         }  
  193.     }  
  194.   
  195.     @Override  
  196.     public void onClick(View v) {  
  197.         switch (v.getId()) {  
  198.         // 取消选择  
  199.         case R.id.bt_cancel:  
  200.             isMultiSelect = false;// 退出多选模式  
  201.             list_delete.clear();// 清楚选中的数据  
  202.             // 重新加载Adapter  
  203.             adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  204.             listView.setAdapter(adapter);  
  205.             linearLayout.setVisibility(View.GONE);  
  206.             break;  
  207.         // 删除  
  208.         case R.id.bt_delete:  
  209.             isMultiSelect = false;  
  210.             // 将数据从list中移除  
  211.             for (int i = 0; i < list.size(); i++) {  
  212.                 for (int j = 0; j < list_delete.size(); j++) {  
  213.                     if (list.get(i).equals(list_delete.get(j))) {  
  214.                         list.remove(i);  
  215.                     }  
  216.                 }  
  217.             }  
  218.             list_delete.clear();  
  219.             // 重新加载Adapter  
  220.             adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  221.             listView.setAdapter(adapter);  
  222.             linearLayout.setVisibility(View.GONE);  
  223.             break;  
  224.   
  225.         default:  
  226.             break;  
  227.         }  
  228.     }  
  229.   
  230. }  
[java] view plain copy
  1. package com.example.listviewitemmulselect;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import android.os.Bundle;  
  8. import android.annotation.SuppressLint;  
  9. import android.app.Activity;  
  10. import android.content.Context;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.view.View.OnLongClickListener;  
  15. import android.view.ViewGroup;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.Button;  
  18. import android.widget.CheckBox;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.ListView;  
  21. import android.widget.TextView;  
  22.   
  23. public class MainActivity extends Activity implements OnClickListener {  
  24.   
  25.     private static final int NOSELECT_STATE = -1;// 表示未选中任何CheckBox  
  26.   
  27.     private ListView listView;  
  28.     private Button bt_cancel, bt_delete;  
  29.     private TextView tv_sum;  
  30.     private LinearLayout linearLayout;  
  31.   
  32.     private List<String> list = new ArrayList<String>();// 数据  
  33.     private List<String> list_delete = new ArrayList<String>();// 需要删除的数据  
  34.     private boolean isMultiSelect = false;// 是否处于多选状态  
  35.   
  36.     private MyAdapter adapter;// ListView的Adapter  
  37.   
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.activity_main);  
  42.   
  43.         listView = (ListView) findViewById(R.id.listView1);  
  44.         bt_cancel = (Button) findViewById(R.id.bt_cancel);  
  45.         bt_delete = (Button) findViewById(R.id.bt_delete);  
  46.         tv_sum = (TextView) findViewById(R.id.tv_sum);  
  47.         linearLayout = (LinearLayout) findViewById(R.id.linearLayout);  
  48.         bt_cancel.setOnClickListener(this);  
  49.         bt_delete.setOnClickListener(this);  
  50.   
  51.         // 设置初始数据  
  52.         list = new ArrayList<String>();  
  53.         for (int i = 0; i < 20; i++) {  
  54.             String str = "Item" + i;  
  55.             list.add(str);  
  56.         }  
  57.   
  58.         // 未选中任何Item,position设置为-1  
  59.         adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  60.         listView.setAdapter(adapter);  
  61.     }  
  62.   
  63.     private class MyAdapter extends BaseAdapter {  
  64.   
  65.         private List<String> list;  
  66.         private LayoutInflater inflater;  
  67.   
  68.         private HashMap<Integer, Integer> isCheckBoxVisible;// 用来记录是否显示checkBox  
  69.         private HashMap<Integer, Boolean> isChecked;// 用来记录是否被选中  
  70.   
  71.         @SuppressLint("UseSparseArrays")  
  72.         public MyAdapter(Context context, List<String> list, int position) {  
  73.             inflater = LayoutInflater.from(context);  
  74.             this.list = list;  
  75.             isCheckBoxVisible = new HashMap<Integer, Integer>();  
  76.             isChecked = new HashMap<Integer, Boolean>();  
  77.             // 如果处于多选状态,则显示CheckBox,否则不显示  
  78.             if (isMultiSelect) {  
  79.                 for (int i = 0; i < list.size(); i++) {  
  80.                     isCheckBoxVisible.put(i, CheckBox.VISIBLE);  
  81.                     isChecked.put(i, false);  
  82.                 }  
  83.             } else {  
  84.                 for (int i = 0; i < list.size(); i++) {  
  85.                     isCheckBoxVisible.put(i, CheckBox.INVISIBLE);  
  86.                     isChecked.put(i, false);  
  87.                 }  
  88.             }  
  89.   
  90.             // 如果长按Item,则设置长按的Item中的CheckBox为选中状态  
  91.             if (isMultiSelect && position >= 0) {  
  92.                 isChecked.put(position, true);  
  93.             }  
  94.         }  
  95.   
  96.         @Override  
  97.         public int getCount() {  
  98.             // TODO Auto-generated method stub  
  99.             return list.size();  
  100.         }  
  101.   
  102.         @Override  
  103.         public Object getItem(int position) {  
  104.             // TODO Auto-generated method stub  
  105.             return list.get(position);  
  106.         }  
  107.   
  108.         @Override  
  109.         public long getItemId(int position) {  
  110.             // TODO Auto-generated method stub  
  111.             return position;  
  112.         }  
  113.   
  114.         @Override  
  115.         public View getView(int position, View convertView, ViewGroup parent) {  
  116.             final ViewHolder viewHolder;  
  117.             if (convertView == null) {  
  118.                 viewHolder = new ViewHolder();  
  119.                 convertView = inflater.inflate(R.layout.item_layout, null);  
  120.                 viewHolder.tv_Name = (TextView) convertView.findViewById(R.id.tv_name);  
  121.                 viewHolder.cb = (CheckBox) convertView.findViewById(R.id.cb_select);  
  122.                 convertView.setTag(viewHolder);  
  123.             } else {  
  124.                 viewHolder = (ViewHolder) convertView.getTag();  
  125.             }  
  126.             final String str = list.get(position);  
  127.             viewHolder.tv_Name.setText(str);  
  128.             // 根据position设置CheckBox是否可见,是否选中  
  129.             viewHolder.cb.setChecked(isChecked.get(position));  
  130.             viewHolder.cb.setVisibility(isCheckBoxVisible.get(position));  
  131.             // ListView每一个Item的长按事件  
  132.             convertView.setOnLongClickListener(new onMyLongClick(position, list));  
  133.             /* 
  134.              * 在ListView中点击每一项的处理 
  135.              * 如果CheckBox未选中,则点击后选中CheckBox,并将数据添加到list_delete中 
  136.              * 如果CheckBox选中,则点击后取消选中CheckBox,并将数据从list_delete中移除 
  137.              */  
  138.             convertView.setOnClickListener(new OnClickListener() {  
  139.   
  140.                 @Override  
  141.                 public void onClick(View v) {  
  142.                     // 处于多选模式  
  143.                     if (isMultiSelect) {  
  144.                         if (viewHolder.cb.isChecked()) {  
  145.                             viewHolder.cb.setChecked(false);  
  146.                             list_delete.remove(str);  
  147.                         } else {  
  148.                             viewHolder.cb.setChecked(true);  
  149.                             list_delete.add(str);  
  150.                         }  
  151.                         tv_sum.setText("共选择了" + list_delete.size() + "项");  
  152.                     }  
  153.                 }  
  154.             });  
  155.             return convertView;  
  156.         }  
  157.   
  158.         class ViewHolder {  
  159.             public TextView tv_Name;  
  160.             public CheckBox cb;  
  161.         }  
  162.   
  163.         // 自定义长按事件  
  164.         class onMyLongClick implements OnLongClickListener {  
  165.   
  166.             private int position;  
  167.             private List<String> list;  
  168.   
  169.             // 获取数据,与长按Item的position  
  170.             public onMyLongClick(int position, List<String> list) {  
  171.                 this.position = position;  
  172.                 this.list = list;  
  173.             }  
  174.   
  175.             // 在长按监听时候,切记将监听事件返回ture  
  176.             @Override  
  177.             public boolean onLongClick(View v) {  
  178.                 isMultiSelect = true;  
  179.                 list_delete.clear();  
  180.                 // 添加长按Item到删除数据list中  
  181.                 list_delete.add(list.get(position));  
  182.                 linearLayout.setVisibility(View.VISIBLE);  
  183.                 tv_sum.setText("共选择了" + list_delete.size() + "项");  
  184.                 for (int i = 0; i < list.size(); i++) {  
  185.                     adapter.isCheckBoxVisible.put(i, CheckBox.VISIBLE);  
  186.                 }  
  187.                 // 根据position,设置ListView中对应的CheckBox为选中状态  
  188.                 adapter = new MyAdapter(MainActivity.this, list, position);  
  189.                 listView.setAdapter(adapter);  
  190.                 return true;  
  191.             }  
  192.         }  
  193.     }  
  194.   
  195.     @Override  
  196.     public void onClick(View v) {  
  197.         switch (v.getId()) {  
  198.         // 取消选择  
  199.         case R.id.bt_cancel:  
  200.             isMultiSelect = false;// 退出多选模式  
  201.             list_delete.clear();// 清楚选中的数据  
  202.             // 重新加载Adapter  
  203.             adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  204.             listView.setAdapter(adapter);  
  205.             linearLayout.setVisibility(View.GONE);  
  206.             break;  
  207.         // 删除  
  208.         case R.id.bt_delete:  
  209.             isMultiSelect = false;  
  210.             // 将数据从list中移除  
  211.             for (int i = 0; i < list.size(); i++) {  
  212.                 for (int j = 0; j < list_delete.size(); j++) {  
  213.                     if (list.get(i).equals(list_delete.get(j))) {  
  214.                         list.remove(i);  
  215.                     }  
  216.                 }  
  217.             }  
  218.             list_delete.clear();  
  219.             // 重新加载Adapter  
  220.             adapter = new MyAdapter(MainActivity.this, list, NOSELECT_STATE);  
  221.             listView.setAdapter(adapter);  
  222.             linearLayout.setVisibility(View.GONE);  
  223.             break;  
  224.   
  225.         default:  
  226.             break;  
  227.         }  
  228.     }  
  229.   
  230. }  
如此,便实现了长按ListView,可以多选,并能批量删除的功能。


项目源码请戳:Android 长按Listview显示CheckBox,实现批量删除 源代码下载

0 0
原创粉丝点击