6 votes

Décocher toutes les cases à cocher dans un ListView personnalisé

J'essaie de créer un bouton "Unselect all" dans une ListActivity pour décocher toutes les cases d'une ListView gérée par un SimpleCursorAdapter personnalisé.

Comme suggéré aquí J'ai essayé

Dans ma ListActivity, j'ai :

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

mais rien ne se passe.

Je me demande si cela n'est pas dû à ma ligne personnalisée :

<?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>

ce qui fait que mListView.setItemChecked() ne trouve pas la case à cocher.

Comment puis-je décocher tous les cb et rafraîchir toutes les lignes à partir d'un bouton dans ma ListActivity ?

Remerciements

6voto

halxinate Points 417

Je me sers d'une astuce sale mais facile à mettre en œuvre :

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

}

Passez-lui votre objet liste. Évitez les listes vraiment longues et compliquées.

4voto

Robby Pond Points 37875

Honnêtement, je ne pense pas que les méthodes setChecked fonctionneront avec une mise en page personnalisée. Elle s'attend à ce que la vue soit une CheckedTextView avec un id de text1.

Et puisque les vues sont recyclées, je pense que la solution est de mettre à jour le booléen de vos objets dans la liste qui détermine si la case à cocher est cochée, puis d'appeler adapter.notifyDataSetChanged() . Vous modifiez l'état booléen des données (ce qui est vraiment important) et vous demandez à l'adaptateur de mettre à jour la ListView. Ainsi, la prochaine fois que les vues seront affichées, la case sera correctement cochée. Et les vues actuelles qui sont affichées seront redessinées.

3voto

hrushi Points 171

Cela a fonctionné pour moi :

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

-1voto

widomin Points 1

J'utilise

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X