Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android ListView的一個問題

Android ListView的一個問題

編輯:Android開發教程

需要的功能很簡單,就是一個帶checkbox的列表,提交時需要知道用戶選擇了那些項目,如下圖:

使用SimpleAdapter作為數據適配器,重寫SimpleAdapter.ViewBinder的方法,這樣用比自定義Adapter要方便點,代碼如下

datas定義是private List<Map<String, Object>> datas=null;

其中讓Map中保存一項自我引用(my)綁定到checkBox

private Map<String, Object> populateMap(String lblNo,
Map<String, Object>... maps) {
    
Map<String, Object> map = null;
if (maps.length > 0) {
map = maps[0];
} else {
map = new HashMap<String, Object>();
}
    
map.put("lblNo", lblNo);
map.put("my", map);
map.put("checked", true);
return map;
}
private void bindAdapter(){
            
        int[] to = new int[] { R.id.lblNo,R.id.ckbIt };
        String[] from = new String[] { "lblNo","my"};
        adapter = new SimpleAdapter(this, datas, R.layout.activity_post_list_item,
                from, to);
        // =======添加刪除事件=======
		//  

後來發現是ckb在執行setChecked時會觸發OnCheckedChange處理程序,

而SimpleAdapter采用的也是控件重用機制,就是當列表往上下拖時,那些被拖出屏幕外的控件會重用(綁定新的數據,參考代碼裡給的那鏈接),由於使用了final在執行ckb.setChecked((Boolean)map.get("checked")); 觸發該控件的OnCheckedChange處理程序,而這個處理程序指向的數據項是前一次綁定的那行即前一次調用setViewValue傳入的數據,這樣就可能導致datas中的某個數據被意外修改,進而引起程序行為的不確定。

解決辦法就是在執行ckb.SetChecked時做個標記,而事件處理程序根據這個標記排除拖動列表產生消息。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved