本文可以幫助 完美解決 在Android中使用ListView時批量操作CheckBox出現的各種問題。
在Android中使用ListActivity可以很方便的綁定一組數據或者一個查詢。但是,使用過程中也會遇到一些問題。在此,我將自己遇到的問題以及解決方法記錄下來,一方面做一個備忘,同時,也希望有緣人能少走彎路。
問題一: Listview中的Item數目到底是多少
ListView中的Item數目可以使用getCount方法獲得,經過驗證得到的結果是,其Item數目等於界面上顯示的Item數目,這個數目可能小於實際上綁定的數據條目數。
那麼,在實際中如果有額外的非綁定數據源的數據需要編輯保存的時候,如何才能保存他們呢?
解決該問題的方法是:自定義ListAdapter,在其中保存額外需要保存的數據。
問題二:在Item中添加CheckBox出現麻煩了
在item中添加Checkbox的時候不小心會遇到麻煩,可能出現的情況是:
(1)Listview不能相應點擊事件
(2)Listview點擊第一個Item的時候最後一個Item也出現點擊事件(反之亦然)
以上兩種情況是我實際遇到的bug,經過各種糾結和反復測試,出現問題的原因是CheckBox相應焦點、點擊事件的優先級別比Listview要高,所以出現問題。
解決方法如下(和問題一一對應):
(1)將Checkbox設置focusable屬性為false
(2)接著將CheckBox設置Clickable屬性為false.
以下是本人程序片段,僅供參考:
- <!-- ans_list.xml -->
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp" >
-
- <TextView
- android:id="@+id/ans_title"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:gravity="center"
- android:textSize="15sp"
- android:textStyle="bold" />
-
- <RelativeLayout
- android:id="@+id/ans_foot"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:paddingLeft="8sp"
- android:paddingRight="8sp" >
-
- <CheckBox
- android:id="@+id/ans_cbx_select"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_marginLeft="10sp"
- android:checked="false" />
- <Button
- android:id="@+id/ans_btn_showInMap"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/ans_cbx_select"
- android:text="@string/ans_btn_showInMap" />
- </RelativeLayout>
-
- <ListView
- android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_above="@id/ans_foot"
- android:layout_below="@id/ans_title"
- android:drawSelectorOnTop="false" >
- </ListView>
-
- <TextView
- android:id="@android:id/empty"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:gravity="center"
- android:text="@string/ans_list_empty"
- android:textSize="25sp"
- android:textStyle="bold" >
- </TextView>
-
- </RelativeLayout>