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 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 }