2011-02-02 56 views
9

我有一個設置CHOICE_MODE_MULTIPLE的ListView。我還有額外的標題來管理 (un)選擇所有項目。問題是:這樣做是否正確?那麼它的作品,但我不知道這是適當的方式。正如你看到下面有一個checkAllCheckBoxes 對象,我傳遞給頭onClickListener()方法。你怎麼看?將不勝感激任何迴應。正確的方式來檢查ListView中的所有複選框?

private OnClickListener checkAllCheckboxes = new OnClickListener(){ 
    public void onClick(View v) { 
     ListView lv = getListView(); 
     int size = getListAdapter().getCount(); 
     if(lv.isItemChecked(0)){ 
      for(int i = 0; i<=size; i++){ 
       lv.setItemChecked(i, false); 
      } 
     } else { 
      for(int i = 0; i<=size; i++){ 
       lv.setItemChecked(i, true); 
      } 
     } 
    } 

}; 
+0

的反應,好點謝謝你們。嗯,我也想知道,也許因爲如果選擇了所有項目這將是更好的補充,聽者只,而不是ListView控件的頭,我不選擇一個從中間,h eader仍然被選中並且看起來不太好 – Dan 2011-02-02 15:38:55

回答

9

您可以優化你的代碼是這樣的:

更換

if(lv.isItemChecked(0)){ 
    for(int i = 0; i<=size; i++){ 
     lv.setItemChecked(i, false); 
    } 
} else { 
    for(int i = 0; i<=size; i++){ 
     lv.setItemChecked(i, true); 
    } 
} 

通過

boolean check = lv.isItemChecked(0); 
    for(int i = 0; i <= size; i++) 
     lv.setItemChecked(i, !check); 
2

這應該做同樣的事情,是一個小更簡潔。循環開始於1,因爲你不想要重置頭的選中狀態,標題是索引0

private OnClickListener checkAllCheckboxes = new OnClickListener(){ 
    public void onClick(View v) { 
     ListView lv = getListView(); 
     int size = lv.getAdapter().getCount(); 
     boolean checked = lv.isItemChecked(0); 
     for(int i=1; i<size; i++) { 
      lv.setItemChecked(i, checked); 
     } 
    } 

}; 
+0

我不確定這是否正確。在他的代碼中,當lv.isItemChecked(0)返回true時,他使用setItemChecked(i,false),所以布爾值被反轉。從1開始也不反轉第一個值。 – Dalmas 2011-02-02 15:24:23

0

這裏的長度就是數組長度在數組中,並chkbox是選擇所有複選框。

chkbox.setOnCheckedChangeListener(新OnCheckedChangeListener(){還需要

 @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      if(chkbox.isChecked()) 
      { 

       for(i=0;i<length;i++) 
       { 

            lv.setItemChecked(i, true); 
       } 

      } 
      else 
      { 
       for(i=0;i<length;i++) 
       { 

            lv.setItemChecked(i, false); 
       } 


      } 

     } 
    }); 
0

羅比的解決方案爲我。因爲我有做的,一個加法。adapter更新,否則當您滾動列表checkbox會恢復。

private OnClickListener checkAllCheckboxes = new OnClickListener(){ 
    public void onClick(View v) { 
     ListView lv = getListView(); 
     int size = lv.getAdapter().getCount(); 
     boolean checked = lv.isItemChecked(0); 
     for(int i=1; i<size; i++) { 
      lv.setItemChecked(i, checked); 

      CustomListItem it = CustomAdapter.get(i); 
      it.setChk(check); // set value in adapter 
     } 
    } 
};