2011-03-15 21 views
6

estoy tratando de hacer un "todo Deseleccionar" botón en un ListActivity a marcar todas las casillas de verificación en un ListView gestionado por un SimpleCursorAdapter personalizado.Desmarque todas las casillas de verificación en un ListView encargo

Como se sugiere here, probé

En mi ListActivity tengo:

Button bt_f_unsel = (Button) findViewById(R.id.btn_f_unsel); 
bt_f_unsel.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) {   
     for (int i=0; i< getListAdapter().getCount(); i++) { 
      mListView.setItemChecked(i, false); 
     } 
    }   
});   

pero no pasa nada.

Me pregunto si esto es debido a mi fila de encargo:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView 
     android:id="@+id/contact_pic" 
     android:layout_width="50dp" 
     android:layout_height="50dp" /> 

    <TextView 
     android:id="@+id/contact_name"   
     android:textSize="10sp" 
     android:singleLine="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
    <CheckBox 
     android:id="@+id/checkbox" 
     android:button="@drawable/whipem_cb" 
     android:layout_alignParentRight="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

que hace mListView.setItemChecked() no encontrar la casilla de verificación.

¿Cómo puedo desactivar todas cb y actualizar todas las filas de un botón en mi ListActivity?

Gracias

Respuesta

4

Honestamente no creo que los métodos setChecked trabajará con un diseño personalizado. Espera que la vista sea un CheckedTextView con una id de texto1.

Y dado que las vistas se reciclan creo que la solución es actualizar cualquier booleano en sus objetos en la lista que determina si la casilla está marcada y luego llamar al adapter.notifyDataSetChanged(). Está cambiando el estado booleano de los datos (que es lo que realmente importa) y le dice al adaptador que actualice el ListView. Entonces, la próxima vez que se dibujen las vistas, la casilla de verificación se marcará correctamente. Y las vistas actuales que se muestran serán redibujadas.

3

estoy usando un truco sucio, pero fácil:

//recursive blind checks removal for everything inside a View 
private void removeAllChecks(ViewGroup vg) { 
    View v = null; 
    for(int i = 0; i < vg.getChildCount(); i++){ 
     try { 
      v = vg.getChildAt(i); 
      ((CheckBox)v).setChecked(false); 
     } 
     catch(Exception e1){ //if not checkBox, null View, etc 
      try { 
       removeAllChecks((ViewGroup)v); 
      } 
      catch(Exception e2){ //v is not a view group 
       continue; 
      } 
     } 
    } 

} 

pasar su lista de objetos a la misma. Solo evita listas realmente largas y complicadas.

+0

¿Qué debo hacer si tenemos más de 100 artículo? solo borra el objeto visible, no el otro? – Google

+0

Si eso es realmente el ListActivity que funcionará incluso para 5000. – halxinate

+0

puede sugerir u PLS lo que pase en removeallchecks? al llamar a este método – Panache

-1

utilizo

checkbox.setChecked(false); 
checkbox.refreshDrawableState(); 
+1

Hola, y bienvenidos a Stack Overflow. Si resaltas el código y haces clic en el botón '{}', se resaltará automáticamente. – Ben

2

Esto funcionó para mí:

MenuViewAdapter adapter = new MenuViewAdapter(this, menuViews,this); 
ListView lv = (ListView)this.findViewById(R.id.menu_list); 


CheckBox cb; 

for(int i=0; i<lv.getChildCount();i++) 
{ 
    cb = (CheckBox)lv.getChildAt(i).findViewById(R.id.checkBox); 
    cb.setChecked(false); 
} 
adapter.notifyDataSetChanged(); 
+0

Usando este código, soy capaz de desactivar casilla de verificación sólo está visible si tengo más de 100 artículo. ¿Has probado para desmarcar el primer elemento y el último elemento de la lista? Este – Google

+0

deselecciona todas las casillas de verificación en la lista – hrushi

+0

lo hice el mismo truco, pero incapaz de marcar todo casilla. desactivé solo el elemento visible. pero cuando me desplazo hacia abajo en la lista, algunas casillas no se desactivan – Google

Cuestiones relacionadas