2011-02-09 32 views
14

Lo que tengo: Tengo un ListView con filas personalizadas, con un CheckBox & dos TextViews en cada fila. Tengo un botón para "Seleccionar todo".Seleccionar Todos los elementos de un ListView (fila personalizada con casilla de verificación)

Lo que quiero: Quiero que cuando hago clic en el botón, todas las casillas de verificación en ListView se marquen/desmarquen.

Cuál es el problema: Al hacer clic en el botón "Seleccionar todo". Estoy haciendo esto:

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

Aquí l.getChildAt (i) me está dando sólo los elementos visibles. Y cuando el índice sale de elementos visibles, el problema ocurre. Quiero verificar todos los CheckBox en List, no solo los visibles.

+0

posible duplicado de [Android Checkbox listview seleccionar todo (deshabilitar/habilitar)] (http://stackoverflow.com/questions/4553186/android-checkbox-listview-select-all-disable-enable) –

Respuesta

21

Ocurrirá, porque adaptador ListView reutiliza vistas. La forma en que intentas hacer es incorrecta. No creo que alguna vez deba acceder a las filas de ListView a través de listview children.

Introduzca una variable en su actividad que contendrá el estado actual (boolean checkAll). Cuando el usuario presiona el botón, debe establecer "checkAll" en verdadero y llamar al notifyDataSetChanged() (para el adaptador arrayadapter), o requery() (para cursoradapter) en el adaptador de su ListView. En el método getView() del adaptador, introduzca una marca para este indicador, así que if (checkAll) {check the check box}

+0

Alex, gracias por la idea. Funcionó. Cheers =) – Khawar

0

Creo que debería ejecutar esta tarea de ejecución prolongada fuera del hilo de la interfaz de usuario. Cuando se hace clic en el botón 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();  

y en onCreate():

this.mHandler = new Handler(); 

Cada elemento de vista de la lista debe ser comprobable como CheckableRelativeLayout que implementa la interfaz comprobable.

Cuestiones relacionadas