本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项。
[1] 程序结构图如下:
其中Person.java是实体类,MainActivity.java是Activity组件类。listitem.xml是自定义的列表每项布局文件。
[2] listitem.xml布局文件源码如下:
[html] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout
3. xmlns:android="http://schemas.android.com/apk/res/android"
4. android:orientation="vertical"
5. android:layout_width="fill_parent"
6. android:layout_height="fill_parent">
7. <LinearLayout
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:orientation="horizontal"
11. android:descendantFocusability="blocksDescendants">
12. <CheckBox
13. android:id="@+id/list.select"
14. android:layout_width="wrap_content"
15. android:layout_height="wrap_content"/>
16. <TextView
17. android:id="@+id/list.name"
18. android:layout_width="fill_parent"
19. android:layout_height="wrap_content"
20. android:layout_weight="1"
21. android:text="Name"
22. android:layout_gravity="center"
23. android:textSize="20dp"
24. android:layout_marginLeft="10dp"/>
25. <TextView
26. android:id="@+id/list.address"
27. android:layout_width="fill_parent"
28. android:layout_height="wrap_content"
29. android:layout_weight="1"
30. android:text="Address"
31. android:layout_gravity="center"
32. android:textSize="20dp"/>
33. </LinearLayout>
34. </LinearLayout>
[3] main.xml布局文件源码如下:
[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:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent">
6. <Button
7. android:id="@+id/show"
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="Show"/>
11. <ListView
12. android:id="@+id/lvperson"
13. android:layout_width="fill_parent"
14. android:layout_height="fill_parent"/>
15. </LinearLayout>
[4] Person.java实体类源码如下:
[html]
view plain
copy
1. package com.andyidea.bean;
2.
3. public class Person {
4.
5. private String name;
6. private String address;
7.
8. public String getName() {
9. return name;
10. }
11. public void setName(String name) {
12. this.name = name;
13. }
14. public String getAddress() {
15. return address;
16. }
17. public void setAddress(String address) {
18. this.address = address;
19. }
20.
21. }
[5] MainActivity.java类源码如下:
[html]
view plain
copy
1. package com.andyidea.listview;
2.
3. import java.util.ArrayList;
4. import java.util.HashMap;
5. import java.util.List;
6.
7. import com.andyidea.bean.Person;
8.
9. import android.app.Activity;
10. import android.app.AlertDialog;
11. import android.content.Context;
12. import android.os.Bundle;
13. import android.util.Log;
14. import android.view.LayoutInflater;
15. import android.view.View;
16. import android.view.ViewGroup;
17. import android.widget.BaseAdapter;
18. import android.widget.Button;
19. import android.widget.CheckBox;
20. import android.widget.ListView;
21. import android.widget.TextView;
22.
23. public class MainActivity extends Activity {
24.
25. Button show;
26. ListView lv;
27. <Person> persons = new ArrayList<Person>();
28. Context mContext;
29. MyListAdapter adapter;
30. <Integer> listItemID = new ArrayList<Integer>();
31.
32. /** Called when the activity is first created. */
33. @Override
34. public void onCreate(Bundle savedInstanceState) {
35. super.onCreate(savedInstanceState);
36. setContentView(R.layout.main);
37. mContext = getApplicationContext();
38. show = (Button)findViewById(R.id.show);
39. lv = (ListView)findViewById(R.id.lvperson);
40.
41. initPersonData();
42. adapter = new MyListAdapter(persons);
43. lv.setAdapter(adapter);
44.
45. show.setOnClickListener(new View.OnClickListener() {
46.
47. @Override
48. public void onClick(View v) {
49.
50. listItemID.clear();
51. i=0;i<adapter.mChecked.size();i++){
52. if(adapter.mChecked.get(i)){
53. listItemID.add(i);
54. }
55. }
56.
57. if(listItemID.size()==0){
58. builder1 = new AlertDialog.Builder(MainActivity.this);
59. builder1.setMessage("没有选中任何记录");
60. builder1.show();
61. }else{
62. sb = new StringBuilder();
63.
64. i=0;i<listItemID.size();i++){
65. ItemID="+listItemID.get(i)+" . ");
66. }
67. builder2 = new AlertDialog.Builder(MainActivity.this);
68. builder2.setMessage(sb.toString());
69. builder2.show();
70. }
71. }
72. });
73. }
74.
75. /**
76. * 模拟数据
77. */
78. private void initPersonData(){
79. Person mPerson;
80. i=1;i<=12;i++){
81. mPerson = new Person();
82. mPerson.setName("Andy"+i);
83. mPerson.setAddress("GuangZhou"+i);
84. persons.add(mPerson);
85. }
86. }
87.
88. //自定义ListView适配器
89. class MyListAdapter extends BaseAdapter{
90. <Boolean> mChecked;
91. <Person> listPerson;
92. <Integer,View> map = new HashMap<Integer,View>();
93.
94. <Person> list){
95. listPerson = new ArrayList<Person>();
96. listPerson = list;
97.
98. mChecked = new ArrayList<Boolean>();
99. i=0;i<list.size();i++){
100. mChecked.add(false);
101. }
102. }
103.
104. @Override
105. public int getCount() {
106. return listPerson.size();
107. }
108.
109. @Override
110. public Object getItem(int position) {
111. return listPerson.get(position);
112. }
113.
114. @Override
115. public long getItemId(int position) {
116. return position;
117. }
118.
119. @Override
120. public View getView(int position, View convertView, ViewGroup parent) {
121. View view;
122. holder = null;
123.
124. if (map.get(position) == null) {
125. position1 = "+position);
126.
127. mInflater = (LayoutInflater) mContext
128. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
129. view = mInflater.inflate(R.layout.listitem, null);
130. holder = new ViewHolder();
131. holder.selected = (CheckBox)view.findViewById(R.id.list_select);
132. holder.name = (TextView)view.findViewById(R.id.list_name);
133. holder.address = (TextView)view.findViewById(R.id.list_address);
134. p = position;
135. map.put(position, view);
136. holder.selected.setOnClickListener(new View.OnClickListener() {
137.
138. @Override
139. public void onClick(View v) {
140. cb = (CheckBox)v;
141. mChecked.set(p, cb.isChecked());
142. }
143. });
144. view.setTag(holder);
145. }else{
146. position2 = "+position);
147. view = map.get(position);
148. holder = (ViewHolder)view.getTag();
149. }
150.
151. holder.selected.setChecked(mChecked.get(position));
152. holder.name.setText(listPerson.get(position).getName());
153. holder.address.setText(listPerson.get(position).getAddress());
154.
155. return view;
156. }
157.
158. }
159.
160. static class ViewHolder{
161. CheckBox selected;
162. TextView name;
163. TextView address;
164. }
165. }
[6] 程序运行后的结果如下: