Question

J'ai une vue de liste contenant une case à cocher et une vue de texte et j'ai ajouté un ViewBinder à mon adaptateur et dans ce classeur, j'ai ajouté un écouteur d'état onchecked à mes cases à cocher et dans l'écouteur d'état onchecked j'ai écrit ce code :

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String id=buttonView.getTag()+"";
                int buttonid=Integer.valueOf(id);               
                if(buttonView.isChecked()==true){   
                    Log.d("checked","checked");
                myDbHelper.MarkAsFavorite(buttonid);

                }

                else if(buttonView.isChecked()==false){
                    Log.d("unchecked","unchecked");
                    myDbHelper.UnMarkAsFavorite(buttonid);
                }

                 cu=myDbHelper.GetCursor();
                 adapter.swapCursor(cu);

            }
        }; 

mais avec ce code, lorsque ma case à cocher était cochée, elle a été enregistrée dans la base de données, puis lorsque je fais défiler la liste, elle est décochée tout seul, elle accède au code de la case non cochée, décoche la case et l'enregistre dans la base de données.

Je l'ai donc corrigé en ajoutant un écouteur onclick à la case à cocher au lieu de l'écouteur onchange state :

public void onclick(View view) {
         String id=view.getTag()+"";
            int buttonid=Integer.valueOf(id);               
            if(((CompoundButton) view).isChecked()==true){  
                Log.d("checked","checked");
            myDbHelper.MarkAsFavorite(buttonid);

            }

            else if(((CompoundButton) view).isChecked()==false){
                Log.d("unchecked","unchecked");
                myDbHelper.UnMarkAsFavorite(buttonid);
            }

             cu=myDbHelper.GetCursor();
             adapter.swapCursor(cu);
     }

Et je n'ai plus de problème.Mais je voulais savoir pourquoi cet auditeur d'état de changement a agi de cette façon ?

Était-ce utile?

La solution

Tu as ceci checkbox à l'intérieur ListView comme ListView réutilise les vues pour plus d'efficacité, le même objet de case à cocher peut être fourni à plusieurs éléments ListView et lorsqu'il est coché pour la même case à cocher est décochée pour une autre.

Autres conseils

Cet auditeur d'état Change a agi de cette manière que lorsque vous faites défiler une liste de sauts, car son appel GeveView qui modifie l'état Cochez la case cochée par conséquent, CheckChangeDlistner Call, qui modifie la valeur dans la base de données.Et lorsque vous avez utilisé ONCLICK votre problème résolu car vous modifiez ListView View View onclick Event Not Fires qui ne change pas la valeur de votre base de données.

Vous pouvez résoudre ce problème en utilisant Viewholder dans ListView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top