android listView 自定义布局结合CheckedTextView实现多选

最终效果图如下:

android listView 自定义布局结合CheckedTextView实现多选_第1张图片


apiDemo中有一个listView实现多选的例子 

比较简单

[plain]  view plain  copy
  1. package com.example.android.apis.view;  
  2.   
  3. import android.app.ListActivity;  
  4. import android.os.Bundle;  
  5. import android.widget.ArrayAdapter;  
  6. import android.widget.ListView;  
  7.   
  8. /**  
  9.  * This example shows how to use choice mode on a list. This list is   
  10.  * in CHOICE_MODE_MULTIPLE mode, which means the items behave like  
  11.  * checkboxes.  
  12.  */  
  13. public class List11 extends ListActivity {  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.   
  19.         setListAdapter(new ArrayAdapter(this,  
  20.                 android.R.layout.simple_list_item_multiple_choice, GENRES));  
  21.           
  22.         final ListView listView = getListView();  
  23.   
  24.         listView.setItemsCanFocus(false);  
  25.         listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  
  26.     }  
  27.   
  28.   
  29.     private static final String[] GENRES = new String[] {  
  30.         "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",  
  31.         "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"  
  32.     };  
  33. }  

利用了framework中的布局 simple_list_item_multiple_choice.xml ,该布局内容就是一个CheckedTextView

[html]  view plain  copy
  1. <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@android:id/text1"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="?android:attr/listPreferredItemHeight"  
  5.     android:textAppearance="?android:attr/textAppearanceLarge"  
  6.     android:gravity="center_vertical"  
  7.     android:checkMark="?android:attr/listChoiceIndicatorMultiple"  
  8.     android:paddingLeft="6dip"  
  9.     android:paddingRight="6dip"  
  10. />  

在实际的应用中我们肯定会遇到复杂布局的情况,一旦使用复杂布局,发现listview原生的多选模式失效了!失效原因通过查看ListView的源码可以发现,问题出在setupChild函数中

[java]  view plain  copy
  1. private void setupChild(View child, int position, int y, boolean flowDown,int childrenLeft, boolean selected, boolean recycled) {  
  2.         ..................  
  3.         if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {  
  4.             if (child instanceof Checkable) {  
  5.                 ((Checkable) child).setChecked(mCheckStates.get(position));  
  6.             }  
  7.         }  
  8.     }  

其中的child对象就是自定义adapter的getView()函数的返回结果,由于我们没有实现Checkable接口所以无法操作。变通办法,ListView有一个察看item是否被选中的函数,结合该函数,修改自定义adapter的getView函数:

[java]  view plain  copy
  1. public View getView(int position, View convertView, ViewGroup parent) {  
  2.         boolean check = ((ListView)parent).isItemChecked(position);  
  3.         viewHolder.myCheckedTextView.setChecked(check);  
  4.     }  

你可能感兴趣的:(Android,编程)