本文主要实现在自定义的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] 程序运行后的结果如下: