近日正忙著編寫一個有 CRUD (Create-Read-Update-Delete) 功能的 ListActvity,其中因為想有多選功能,所以想把一個 CheckBox 放到每一行的一旁,感覺就跟 CheckBoxPreference 差不多。
我花了很多時間想著使用 Custom List Adaptor 或 extend SimpleAdaptor,最終當然會成功,不過就是代碼太煩瑣,設計不好。
幸好從網上找到一編教學,它解釋怎樣製作 widget (即 custom Relative Layout 跟 custom CheckBox),用後我覺得十分有用,既簡潔又易用,大家不防參考一下:
Custom ListView with ability to check items
[Update: 2012-02-05]
這個方法有一個大問題 (迫使我放棄它) - 這個方法不適用於 List 數據操作:
- 因為 ListView 裡 Recycling 的機制,假如刪除一行 List 數據,然後呼叫 notifyDataSetChanged(),ListView 會確實的移除了那一行 ,不過有時候那個勾勾會出現在另一行 (這行之前並沒有點選喔)。因為我使用SimpleAdapter,每次調用 notifyDataSetChanged() 時,View(如 TextView) 中的資料會跟據 List 數據改變,但因勾選並沒有關聯到List 數據,它只保留在 custom Relative Layout/CheckBox 中,那 Adapter 調用 getView 時,原來的 Check 狀態便保留著,因 List 數據位移了, Check 狀態便一起位移,形成錯誤。
- 避免這個問題的方法,我目前只想到呼叫 getListView().clearChoices(),把所有的勾勾取消。
- 對於單向操作 (即只用作取得勾選的項目),它應該是一個很不錯的方案。一但須要操作 List 原數據時便不可以了。
這樣又回歸原方法了,那我把我用的方法寫出來吧:
- Item/Row 的 Layout 放一個 CheckBox,並設為 android:focusable="false"
- 新增一個 boolean 的值並綁到數據去
- 如使用 SimpleAdapter,可以在數據中加一個 Key-value 值,Key 為 "rowSelected", 值為 Boolean。
- 如數據使用自訂的List
沒有留言:
發佈留言