SimpleCursorAdapter作为Android开发中一个非常常用的Adapter类,在ListView(ListActivity)和Cursor类之间架设了一条非常方便的桥梁。但是需求经常是除了表示之外还会希望能够通过CheckBox进行多重选择。为此对SimpleCursorAdapter类进行了扩展。代码如下

 

   
   
   
   
  1. package LyricPlayer.xwg;  
  2.  
  3. import java.util.ArrayList;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.ViewGroup;  
  9. import android.widget.CheckBox;  
  10. import android.widget.SimpleCursorAdapter;  
  11.  
  12. public class CheckBoxCursorAdapter extends SimpleCursorAdapter {  
  13.     private ArrayList selection = new ArrayList();   
  14.     private int mCheckBoxId = 0;  
  15.     private String mIdColumn;  
  16.       
  17.     public CheckBoxCursorAdapter(Context context, int layout, Cursor c,  
  18.             String[] from, int[] to, int checkBoxId, String idColumn) {  
  19.         super(context, layout, c, from, to);  
  20.         mCheckBoxId = checkBoxId;  
  21.         mIdColumn = idColumn;  
  22.     }  
  23.  
  24.     @Override 
  25.     public int getCount() {  
  26.         return super.getCount();  
  27.     }  
  28.  
  29.     @Override 
  30.     public Object getItem(int position) {  
  31.         return super.getItem(position);  
  32.     }  
  33.  
  34.     @Override 
  35.     public long getItemId(int position) {  
  36.         return super.getItemId(position);  
  37.     }  
  38.  
  39.     @Override 
  40.     public View getView(final int position, View convertView, ViewGroup parent) {  
  41.         View view = super.getView(position, convertView, parent);  
  42.         CheckBox checkbox = (CheckBox)view.findViewById(mCheckBoxId);  
  43.         checkbox.setOnClickListener(new OnClickListener(){  
  44.             @Override 
  45.             public void onClick(View v) {  
  46.                 Cursor cursor = getCursor();  
  47.                 cursor.moveToPosition(position);  
  48.                 int rowId = cursor.getInt(cursor.getColumnIndexOrThrow(mIdColumn));  
  49.                 int index = selection.indexOf(rowId);  
  50.                 if (index != -1) {    
  51.                     selection.remove(index);    
  52.                 } else {    
  53.                     selection.add(rowId);    
  54.                 }    
  55.             }  
  56.         });  
  57.         Cursor cursor = getCursor();  
  58.         cursor.moveToPosition(position);  
  59.         int rowId = cursor.getInt(cursor.getColumnIndexOrThrow(mIdColumn));  
  60.         if (selection.indexOf(rowId)!= -1) {    
  61.             checkbox.setChecked(true);    
  62.         } else {    
  63.             checkbox.setChecked(false);    
  64.         }    
  65.         return view;  
  66.     }  
  67.       
  68.     ArrayList getSelectedItems(){  
  69.         return selection;  
  70.     }  
  71. }  

 

做的工作有两个,一个是重新实现了getView方法以增加对CheckBox的支持。

另一个是增加了getSelectedItems方法以取得选中的项目在Cursor中由idColumn指定的信息。一般来说这个信息会事对应数据的Id。数据按照选择的顺序排列。

用法和SimpleCursorAdapter基本一样,只是增加了CheckBox的资源Id和用来从Cursor选择数据的Column名。

当然了,在用于SimpleCursorAdapter的资源文件中需要加上CheckBox控件。就像下面中31行到35行表示的那样。

   
   
   
   
  1. xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout 
  3.     android:id="@+id/music_row" 
  4.     android:layout_height="wrap_content" 
  5.     xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"> 
  6.      <TextView 
  7.      android:id="@+id/music_title" 
  8.      android:layout_width="wrap_content" 
  9.      android:layout_height="wrap_content" 
  10.      android:layout_alignParentLeft="true" 
  11.      android:layout_alignParentTop="true" 
  12.      android:textSize="20dip" 
  13.      android:text="TextView" android:layout_gravity="center_vertical"/> 
  14.      <TextView 
  15.         android:id="@+id/lyric_comma" 
  16.         android:layout_width="wrap_content" 
  17.         android:layout_height="wrap_content" 
  18.         android:layout_alignParentLeft="true" 
  19.         android:layout_alignParentTop="true" 
  20.         android:textSize="16dip" 
  21.         android:text="," android:layout_gravity="center_vertical"/> 
  22.      <TextView 
  23.         android:id="@+id/music_duration" 
  24.         android:layout_width="fill_parent" 
  25.         android:layout_height="wrap_content" 
  26.         android:layout_alignParentLeft="true" 
  27.         android:layout_alignParentTop="true" 
  28.         android:textSize="16dip" 
  29.         android:text="" android:layout_gravity="center_vertical" android:layout_weight="1"/> 
  30.  
  31.     <CheckBox 
  32.          android:id="@+id/checkBox" 
  33.          android:layout_width="wrap_content" 
  34.          android:layout_height="wrap_content" 
  35.          android:layout_gravity="right"/> 
  36.       
  37. LinearLayout>