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

来源:互联网 发布:粉尘检测数据 编辑:程序博客网 时间:2024/05/29 16:19
来自:http://www.cnblogs.com/LIANQQ/p/3584374.html

ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验很不好,也给用户带来了很大的麻烦。

实现效果图


具体实现代码

select.xml

主布局文件包含一个ListView还有一个隐藏的布局,包含了两个Button一个TextView,默认布局为gone,当监听到长按响应事件时候显示。

复制代码
 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="vertical" > 6      7     <ListView  8          9         android:id="@+id/list"10         android:layout_width="match_parent"11         android:layout_height="match_parent"12         android:layout_weight="1"13         android:cacheColorHint="#FFF" >14 15         </ListView>16         17     <RelativeLayout 18         19         android:id="@+id/relative"20         android:layout_width="fill_parent"21         android:layout_height="50dp"22         android:gravity="bottom"23         android:background="@color/lemonchiffon"24         android:visibility="gone"25         >26         <Button 27             28             android:id="@+id/cancle"29             android:layout_width="wrap_content"30             android:layout_height="wrap_content"31             android:text="撤销    |"32             android:textSize="20sp"33             android:background="@null"34             android:layout_centerVertical="true"35             36             />37         <TextView 38             39             android:id="@+id/txtcount"40             android:layout_width="wrap_content"41             android:layout_height="wrap_content"42             android:text="共计"43             android:textSize="15sp"44             android:layout_centerInParent="true"45             46             />47         48         <Button 49             50             android:id="@+id/delete"51             android:layout_width="wrap_content"52             android:layout_height="wrap_content"53             android:text="|  删除"54             android:textSize="20sp"55             android:background="@null"56             android:layout_alignParentRight="true"57             android:layout_centerVertical="true"58             />59         60         61     </RelativeLayout>62 </LinearLayout>
复制代码

item.xml

包含一个TextView 一个CheckBox

复制代码
 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/txtName" 9         android:layout_width="match_parent"10         android:layout_height="wrap_content"11         android:layout_alignParentLeft="true"12         android:layout_centerVertical="true"13         android:layout_gravity="center_vertical"14         android:layout_marginLeft="5dp"15         android:layout_weight="1"16         android:text="444444444444"17         android:textSize="17sp"18         android:textColor="#333" />19     20     <CheckBox 21         android:id="@+id/check"22         android:layout_width="wrap_content"23         android:layout_height="wrap_content"24         android:visibility="gone"25         android:clickable="false"26         />27 </LinearLayout>
复制代码

通过自定义Adapter绑定ListView数据源,实现长按监听,在长按监听时候,切记将监听事件返回ture。

复制代码
  1 /**  2      * @author ieasy360_1  3      * 自定义Adapter  4      */  5     class Adapter extends BaseAdapter{  6         private Context context;  7         private LayoutInflater inflater=null;  8         private HashMap<Integer, View> mView ;  9         public  HashMap<Integer, Integer> visiblecheck ;//用来记录是否显示checkBox 10         public  HashMap<Integer, Boolean> ischeck; 11         private TextView txtcount; 12         public Adapter(Context context,TextView txtcount) 13         { 14             this.context = context; 15             this.txtcount = txtcount; 16             inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 17             mView = new HashMap<Integer, View>(); 18             visiblecheck = new HashMap<Integer, Integer>(); 19             ischeck      = new HashMap<Integer, Boolean>(); 20             if(isMulChoice){ 21                 for(int i=0;i<array.size();i++){ 22                     ischeck.put(i, false); 23                     visiblecheck.put(i, CheckBox.VISIBLE); 24                 } 25             }else{ 26                 for(int i=0;i<array.size();i++) 27                 { 28                     ischeck.put(i, false); 29                     visiblecheck.put(i, CheckBox.INVISIBLE); 30                 } 31             } 32         } 33  34         public int getCount() { 35             // TODO Auto-generated method stub 36             return array.size(); 37         } 38  39         public Object getItem(int position) { 40             // TODO Auto-generated method stub 41             return array.get(position); 42         } 43  44         public long getItemId(int position) { 45             // TODO Auto-generated method stub 46             return 0; 47         } 48  49         public View getView(final int position, View convertView, ViewGroup parent) { 50             // TODO Auto-generated method stub 51             View view = mView.get(position); 52             if(view==null) 53             { 54                 view = inflater.inflate(R.layout.item, null); 55                 TextView txt = (TextView)view.findViewById(R.id.txtName); 56                 final CheckBox ceb = (CheckBox)view.findViewById(R.id.check); 57                  58                 txt.setText(array.get(position)); 59                  60                 ceb.setChecked(ischeck.get(position)); 61                 ceb.setVisibility(visiblecheck.get(position)); 62                  63                 view.setOnLongClickListener(new Onlongclick()); 64                  65                 view.setOnClickListener(new OnClickListener() { 66                      67                     public void onClick(View v) { 68                         // TODO Auto-generated method stub 69                         if(isMulChoice){ 70                             if(ceb.isChecked()){ 71                                 ceb.setChecked(false); 72                                 selectid.remove(array.get(position)); 73                             }else{ 74                                 ceb.setChecked(true); 75                                 selectid.add(array.get(position)); 76                             } 77                             txtcount.setText("共选择了"+selectid.size()+"项"); 78                         }else { 79                             Toast.makeText(context, "点击了"+array.get(position), Toast.LENGTH_LONG).show(); 80                         } 81                     } 82                 }); 83                  84                 mView.put(position, view); 85             } 86             return view; 87         } 88          89         class Onlongclick implements OnLongClickListener{ 90  91             public boolean onLongClick(View v) { 92                 // TODO Auto-generated method stub 93                  94                 isMulChoice = true; 95                 selectid.clear(); 96                 layout.setVisibility(View.VISIBLE); 97                 for(int i=0;i<array.size();i++) 98                 { 99                     adapter.visiblecheck.put(i, CheckBox.VISIBLE);100                 }101                 adapter = new Adapter(context,txtcount);102                 listview.setAdapter(adapter);103                 return true;104             }105         }106     }
复制代码

全部实现代码

复制代码
  1 package com.example.test;  2 import java.util.ArrayList;  3 import java.util.HashMap;  4 import java.util.List;  5 import android.app.Activity;  6 import android.content.Context;  7 import android.os.Bundle;  8 import android.view.ContextMenu;  9 import android.view.ContextMenu.ContextMenuInfo; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.View.OnClickListener; 13 import android.view.View.OnLongClickListener; 14 import android.view.ViewGroup; 15 import android.widget.BaseAdapter; 16 import android.widget.Button; 17 import android.widget.CheckBox; 18 import android.widget.ListView; 19 import android.widget.RelativeLayout; 20 import android.widget.TextView; 21 import android.widget.Toast; 22  23 /** 24  * @author ieasy360_1 25  *  26  */ 27 public class MulSelect extends Activity implements OnClickListener { 28      29     private ListView listview; 30     private Context  context; 31     private List<String> array = new ArrayList<String>(); 32     private List<String> selectid = new ArrayList<String>(); 33     private boolean isMulChoice = false; //是否多选 34     private Adapter  adapter; 35     private RelativeLayout layout; 36     private Button cancle,delete; 37     private TextView txtcount; 38  39     @Override 40     protected void onCreate(Bundle savedInstanceState) { 41         // TODO Auto-generated method stub 42         super.onCreate(savedInstanceState); 43         setContentView(R.layout.select); 44         context = this; 45         listview = (ListView)findViewById(R.id.list); 46         layout = (RelativeLayout)findViewById(R.id.relative); 47         txtcount = (TextView)findViewById(R.id.txtcount); 48         cancle   = (Button)findViewById(R.id.cancle); 49         delete   = (Button)findViewById(R.id.delete); 50         cancle.setOnClickListener(this); 51         delete.setOnClickListener(this); 52         init(); 53         adapter = new Adapter(context,txtcount); 54         listview.setAdapter(adapter); 55          56     } 57      58     void init() 59     { 60         for(int i=0;i<20;i++) 61         { 62             array.add("小明"+i); 63         } 64     } 65      66     public void onClick(View v) { 67         // TODO Auto-generated method stub 68         switch (v.getId()) { 69         case R.id.cancle: 70             isMulChoice = false; 71             selectid.clear(); 72             adapter = new Adapter(context,txtcount); 73             listview.setAdapter(adapter); 74             layout.setVisibility(View.INVISIBLE); 75             break; 76         case R.id.delete: 77             isMulChoice =false; 78             for(int i=0;i<selectid.size();i++){ 79                 for(int j=0;j<array.size();j++){ 80                     if(selectid.get(i).equals(array.get(j))){ 81                         array.remove(j); 82                     } 83                 } 84             } 85             selectid.clear(); 86             adapter = new Adapter(context,txtcount); 87             listview.setAdapter(adapter); 88             layout.setVisibility(View.INVISIBLE); 89             break; 90         default: 91             break; 92         } 93          94     } 95      96     @Override 97     public void onCreateContextMenu(ContextMenu menu, View v, 98             ContextMenuInfo menuInfo) { 99         // TODO Auto-generated method stub100         super.onCreateContextMenu(menu, v, menuInfo);101         menu.setHeaderTitle("操作");102     }103 104     /**105      * @author ieasy360_1106      * 自定义Adapter107      */108     class Adapter extends BaseAdapter{109         private Context context;110         private LayoutInflater inflater=null;111         private HashMap<Integer, View> mView ;112         public  HashMap<Integer, Integer> visiblecheck ;//用来记录是否显示checkBox113         public  HashMap<Integer, Boolean> ischeck;114         private TextView txtcount;115         public Adapter(Context context,TextView txtcount)116         {117             this.context = context;118             this.txtcount = txtcount;119             inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);120             mView = new HashMap<Integer, View>();121             visiblecheck = new HashMap<Integer, Integer>();122             ischeck      = new HashMap<Integer, Boolean>();123             if(isMulChoice){124                 for(int i=0;i<array.size();i++){125                     ischeck.put(i, false);126                     visiblecheck.put(i, CheckBox.VISIBLE);127                 }128             }else{129                 for(int i=0;i<array.size();i++)130                 {131                     ischeck.put(i, false);132                     visiblecheck.put(i, CheckBox.INVISIBLE);133                 }134             }135         }136 137         public int getCount() {138             // TODO Auto-generated method stub139             return array.size();140         }141 142         public Object getItem(int position) {143             // TODO Auto-generated method stub144             return array.get(position);145         }146 147         public long getItemId(int position) {148             // TODO Auto-generated method stub149             return 0;150         }151 152         public View getView(final int position, View convertView, ViewGroup parent) {153             // TODO Auto-generated method stub154             View view = mView.get(position);155             if(view==null)156             {157                 view = inflater.inflate(R.layout.item, null);158                 TextView txt = (TextView)view.findViewById(R.id.txtName);159                 final CheckBox ceb = (CheckBox)view.findViewById(R.id.check);160                 161                 txt.setText(array.get(position));162                 163                 ceb.setChecked(ischeck.get(position));164                 ceb.setVisibility(visiblecheck.get(position));165                 166                 view.setOnLongClickListener(new Onlongclick());167                 168                 view.setOnClickListener(new OnClickListener() {169                     170                     public void onClick(View v) {171                         // TODO Auto-generated method stub172                         if(isMulChoice){173                             if(ceb.isChecked()){174                                 ceb.setChecked(false);175                                 selectid.remove(array.get(position));176                             }else{177                                 ceb.setChecked(true);178                                 selectid.add(array.get(position));179                             }180                             txtcount.setText("共选择了"+selectid.size()+"项");181                         }else {182                             Toast.makeText(context, "点击了"+array.get(position), Toast.LENGTH_LONG).show();183                         }184                     }185                 });186                 187                 mView.put(position, view);188             }189             return view;190         }191         192         class Onlongclick implements OnLongClickListener{193 194             public boolean onLongClick(View v) {195                 // TODO Auto-generated method stub196                 197                 isMulChoice = true;198                 selectid.clear();199                 layout.setVisibility(View.VISIBLE);200                 for(int i=0;i<array.size();i++)201                 {202                     adapter.visiblecheck.put(i, CheckBox.VISIBLE);203                 }204                 adapter = new Adapter(context,txtcount);205                 listview.setAdapter(adapter);206                 return true;207             }208         }209     }210 }
复制代码
0 0
原创粉丝点击