Android 長按Listview顯示CheckBox,實現批量刪除。

ListView實現的列表,如果是可編輯,可刪除的,一般都要提供批量刪除功能,否則的話,一項一項的刪除體驗很不好,也給用戶帶來瞭很大的麻煩。

 

實現效果圖

 

 

 

具體實現代碼

 

select.xml

 

主佈局文件包含一個ListView還有一個隱藏的佈局,包含瞭兩個Button一個TextView,默認佈局為gone,當監聽到長按響應事件時候顯示。

 

 

復制代碼

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <LinearLayout xmlns:android="https://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="https://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 stub

100         super.onCreateContextMenu(menu, v, menuInfo);

101         menu.setHeaderTitle("操作");

102     }

103 

104     /**

105      * @author ieasy360_1

106      * 自定義Adapter

107      */

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 ;//用來記錄是否顯示checkBox

113         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 stub

139             return array.size();

140         }

141 

142         public Object getItem(int position) {

143             // TODO Auto-generated method stub

144             return array.get(position);

145         }

146 

147         public long getItemId(int position) {

148             // TODO Auto-generated method stub

149             return 0;

150         }

151 

152         public View getView(final int position, View convertView, ViewGroup parent) {

153             // TODO Auto-generated method stub

154             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 stub

172                         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 stub

196                 

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 }

發佈留言