2011-02-02 3 views
9

У меня есть ListView с набором CHOICE_MODE_MULTIPLE. У меня также есть дополнительный заголовок для управления (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

ответ

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

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 
     } 
    } 
}; 
Смежные вопросы