Android中ListView结合CheckBox判断选中项

时间:2021-11-13 19:45:35
本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项。

[1] 程序结构图如下:

Android中ListView结合CheckBox判断选中项

 

其中Person.java是实体类,MainActivity.java是Activity组件类。listitem.xml是自定义的列表每项布局文件。

[2] listitem.xml布局文件源码如下:

  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布局文件源码如下:
  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实体类源码如下:
  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类源码如下:
  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.     List<Person> persons = new ArrayList<Person>();  
  28.     Context mContext;  
  29.     MyListAdapter adapter;  
  30.     List<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.                 for(int 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.                     AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);  
  59.                     builder1.setMessage("没有选中任何记录");  
  60.                     builder1.show();  
  61.                 }else{  
  62.                     StringBuilder sb = new StringBuilder();  
  63.                       
  64.                     for(int i=0;i<listItemID.size();i++){  
  65.                         sb.append("ItemID="+listItemID.get(i)+" . ");  
  66.                     }  
  67.                     AlertDialog.Builder 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.         for(int 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.         List<Boolean> mChecked;  
  91.         List<Person> listPerson;  
  92.         HashMap<Integer,View> map = new HashMap<Integer,View>();   
  93.           
  94.         public MyListAdapter(List<Person> list){  
  95.             listPerson = new ArrayList<Person>();  
  96.             listlistPerson = list;  
  97.               
  98.             mChecked = new ArrayList<Boolean>();  
  99.             for(int 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.             ViewHolder holder = null;  
  123.               
  124.             if (map.get(position) == null) {  
  125.                 Log.e("MainActivity","position1 = "+position);  
  126.                   
  127.                 LayoutInflater 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.                 final int p = position;  
  135.                 map.put(position, view);  
  136.                 holder.selected.setOnClickListener(new View.OnClickListener() {  
  137.                       
  138.                     @Override  
  139.                     public void onClick(View v) {  
  140.                         CheckBox cb = (CheckBox)v;  
  141.                         mChecked.set(p, cb.isChecked());  
  142.                     }  
  143.                 });  
  144.                 view.setTag(holder);  
  145.             }else{  
  146.                 Log.e("MainActivity","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] 程序运行后的结果如下:

Android中ListView结合CheckBox判断选中项