2011-02-09 17 views
14

Cosa ho: Ho un ListView con righe personalizzate, con un CheckBox & due TextViews in ogni riga. Ho un pulsante per "Seleziona tutto".Seleziona tutti gli elementi di un ListView (riga personalizzata con la casella di controllo)

Cosa voglio: Voglio che quando faccio clic sul pulsante, tutti i CheckBox in ListView vengano selezionati/deselezionati.

Qual è il problema: In OnFare clic sul pulsante "Seleziona tutto". Sto facendo questo:

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.. 
    } 
} 

Qui l.getChildAt (i) mi sta dando solo gli elementi visibili. E quando l'indice esce dagli elementi visibili, si verifica il problema. Voglio controllare tutti i CheckBox in List, non solo quelli visibili.

+0

possibile duplicato di [Vista elenco casella di controllo Android selezionare tutto (disattiva/attiva)] (http://stackoverflow.com/questions/4553186/android-checkbox-listview-select-all-disable-enable) –

risposta

21

E avverrà, perché adattatore ListView riutilizza vista. Il modo in cui stai tentando di fare è sbagliato. Non penso che tu debba mai accedere alle righe di listview attraverso i bambini di listview.

Introdurre una variabile nella propria attività, che manterrà lo stato corrente (boolean checkAll). Quando l'utente preme il pulsante, deve impostare "checkAll" su true e chiamare notifyDataSetChanged() (per arrayadapter) o requery() (per cursoradapter) sull'adattatore di ListView. Nel metodo getView() dell'adattatore introdurre un controllo per questo flag, quindi if (checkAll) {check the check box}

+0

Alex, grazie per l'idea. Ha funzionato. Saluti =) – Khawar

0

Penso che dovresti eseguire questa attività di lunga durata dal thread dell'interfaccia utente. Facendo clic sul pulsante in 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();  

e in onCreate():

this.mHandler = new Handler(); 

Ogni elemento nella visualizzazione elenco dovrebbe essere ispezionabile come CheckableRelativeLayout che implementa l'interfaccia controllabile.

Problemi correlati