2011-02-09 2 views
14

Что у меня есть: У меня есть ListView с настраиваемыми строками, с CheckBox & два текстовых элемента в каждой строке. У меня есть кнопка «Выбрать все».Выделить все элементы ListView (настраиваемая строка с флажком в нем)

Что я хочу: Я хочу, чтобы при нажатии кнопки все CheckBox в ListView получили флажок/непроверенный.

В чем проблема: В OnClick кнопки «Выбрать все». я делаю это:

public void OnClickSelectAllButton(View view) 
{ 
    ListView l = getListView(); 
    int count = l.getCount(); 
    for(int i=0; i<count; ++i) 
    { 
     ViewGroup row = (ViewGroup)l.getChildAt(i); 
     CheckBox check = (CheckBox) row.findViewById(R.id.checkBoxID); 
     check.setChecked(true); // true for select all and false for unselect all etc.. 
    } 
} 

Здесь l.getChildAt (я) дают мне только видимые элементы. И когда индекс выходит из видимых элементов, возникает проблема. Я хочу проверить все CheckBox в List, а не только на видимые.

+0

Возможный дубликат [Android Checkbox listview выбрать все (отключить/включить)] (http://stackoverflow.com/questions/4553186/android-checkbox-listview-select-all-disable-enable) –

ответ

21

Это будет происходить, потому что ListView адаптер повторно представления. То, как вы пытаетесь сделать, неверно. Я не думаю, что вам когда-либо приходилось обращаться к строкам списка через дочерние элементы списка.

Внесите в свою деятельность переменную, которая будет удерживать текущее состояние (boolean checkAll). Когда пользователь нажимает кнопку, он должен установить «checkAll» в значение true и вызвать notifyDataSetChanged() (для массива) или requery() (для курсора) адаптера ListView. В способе адаптера getView() ввести проверку для этого флага, поэтому if (checkAll) {check the check box}

+0

Alex, Спасибо за идея. Это сработало. Приветствия =) – Khawar

0

Я думаю, что вы должны запустить эту долгосрочную задачу из потока пользовательского интерфейса. При нажатии кнопки в OnClickListener:

new Thread(new Runnable() { 
         @Override 
         public void run() { 
          for (int i = 0; i < list.getAdapter().getCount(); i++) { 
           final int position = i; 
           mHandler.post(new Runnable() { 
            @Override 
            public void run() { 
             list.setItemChecked(pos, true); 
            } 
           }); 
          } 
         } 
        }).start();  

и в OnCreate():

this.mHandler = new Handler(); 

Каждый элемент в списке должен быть Checkable как CheckableRelativeLayout, который реализует интерфейс чековые.

Смежные вопросы