2011-02-02 12 views
9

Tengo un ListView con el conjunto CHOICE_MODE_MULTIPLE. También tengo encabezado adicional para administrar (un) seleccionando todos los artículos. La pregunta es: ¿es la forma correcta de hacer eso? Bueno, funciona, sin embargo, no estoy seguro de que sea así. Como ve a continuación, hay un objeto checkAllCheckBoxes que paso al encabezado en el método ClickClistener(). ¿Qué piensas? Estaría agradecido por cualquier respuesta.¿Manera correcta de marcar todas las casillas de verificación en 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

gracias a todos por las respuestas, buenos puntos. Bien también me pregunto que tal vez sería mejor añadir que escucha a Listview lugar sólo en la cabecera, como si se seleccionan todos los elementos y anular la selección de una de la en el medio, la h eader still está seleccionado y no se ve bien – Dan

Respuesta

9

puede optimizar su código como este:

Reemplazar

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); 
    } 
} 

por

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

Esto debería hacer lo mismo y es un poco más concisa. El bucle comienza en 1, ya que no desea restablecer el estado de activación de la cabecera, y la cabecera es el índice 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

No estoy seguro de que sea correcto. En su código, cuando lv.isItemChecked (0) devuelve true, usa setItemChecked (i, false), por lo que el valor booleano se invierte. Comenzar en 1 tampoco revierte el primer valor. – Dalmas

0

donde la longitud es la longitud de matriz en la matriz y chkbox es seleccionar todo casilla.

chkbox.setOnCheckedChangeListener (nueva OnCheckedChangeListener() {También se requiere

 @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

solución de Robby trabajado para mí. Como tengo que hacer una adición en eso. adapter actualización, de lo contrario cuando se desplaza la lista checkbox se restauración.

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 
     } 
    } 
}; 
Cuestiones relacionadas