2011-04-06 123 views
3

我有一個列表視圖,其中有大約200個項目,我爲複選框實現了自定義ArrayAdapter。我使用SparseBooleanArray來存儲框的值。Android - ListView:未選中複選框

所有這些工作正常,但我似乎無法圖形更新框的檢查。如果用戶點擊,那麼該框被檢查。但是,如果我在我的代碼中調用setChecked,它對框本身沒有影響(所以即使它的值爲真,也不會打勾)。

我已經通過嘗試將所有框設置爲true並且沒有運氣進行了測試,即使它們都已檢查完畢,但它們並未顯示它們是。不知道你需要什麼樣的代碼看到,但我已經在我的適配器卡住的好措施:

class CheckBoxArrayAdapter extends ArrayAdapter<String> implements CompoundButton.OnCheckedChangeListener { 
private SparseBooleanArray checkedBoxes; 
Context context; 

public CheckBoxArrayAdapter(Context context, int resource, List<String> objects) { 
    super(context, resource, objects); 
    checkedBoxes = new SparseBooleanArray(); 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final CheckBox view = (CheckBox) super.getView(position, convertView, parent); 
     //if(convertView == null) { 
      //convertView = view.inflate(context, R.layout.list_item, null); 
     //} 
    view.setTag(position); 
    view.setChecked(checkedBoxes.get(position, false)); 
    System.out.println(view.getTag() + ": " + view.isChecked()); 
    view.setOnCheckedChangeListener(this); 
    return view; 
} 

public boolean isChecked(int position) { 
    return checkedBoxes.get(position, false); 
} 
public void setChecked(int position, boolean isChecked) { 
    checkedBoxes.put(position, isChecked); 
    notifyDataSetChanged(); 
} 

public void toggle(int position) { 
    setChecked(position, !isChecked(position)); 
} 

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    checkedBoxes.put((Integer) buttonView.getTag(), buttonView.isChecked()); 
} 

}

謝謝你們!

+0

可能不值得一提,但即使設置在XML中啓用的複選框也沒有顯示任何內容,當然我錯過了一些較小的內容,但是我看不到它! – 2011-04-06 16:58:17

+0

出於好奇,爲什麼不直接使用ListView中的多重選擇支持? http://developer.android.com/reference/android/widget/AbsListView.html#attr_android:choiceMode – 2011-04-06 17:07:48

+0

我已經添加了android:choiceMode是多項選擇,但它似乎是普遍的共識是使用自定義適配器。大多數android應用程序似乎都包含複選框。 – 2011-04-06 17:24:39

回答

2

好吧,看來經過文本視圖是做的最好的方法,把它們作爲列表項,並以此作爲你的聽衆:

  public void onItemClick(AdapterView<?> parent, View view, int pos,long id) 
     { 
      if(!isChecked.get(pos)) { 
       messageList.setItemChecked(pos, true); 
       isChecked.put(pos, true); 
      }else{ 
       messageList.setItemChecked(pos, false); 
       isChecked.put(pos, false); 
      } 
      //sendEmail("[email protected]", address.get(pos) + ": " + subject.get(pos), Jsoup.parse(message.get(pos)).toString()); 
     } 

我以前使用的是由谷歌Android開發人員提供的示例這就是爲什麼我認爲這很平常。但是,不管是不是,這種方式是更簡單!