Frage

Ich habe eine Listenansicht, die ein Kontrollkästchen und eine Textansicht enthält, und ich habe meinem Adapter einen ViewBinder hinzugefügt. In diesem Viewbinder habe ich meinen Kontrollkästchen einen Onchecked-Status-Listener hinzugefügt und im Onchecked-Status-Listener habe ich diesen Code geschrieben:

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

            }
        }; 

Aber mit diesem Code wurde mein Kontrollkästchen beim Aktivieren in der Datenbank gespeichert. Wenn ich dann durch die Listenansicht scrolle, wird es von selbst deaktiviert. Es greift auf den Code des deaktivierten Kontrollkästchens zu, deaktiviert das Kontrollkästchen und speichert es in der Datenbank.

Deshalb habe ich das Problem behoben, indem ich dem Kontrollkästchen anstelle des Onchange-Status-Listeners einen Onclick-Listener hinzugefügt habe:

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

Und ich habe kein Problem mehr.Aber ich wollte wissen, warum sich dieser Change-State-Listener so verhält?

War es hilfreich?

Lösung

Du hast das checkbox innen ListView Da ListView die Ansichten aus Effizienzgründen wiederverwendet, kann dasselbe Kontrollkästchenobjekt für mehrere ListView-Elemente bereitgestellt werden, und wenn es für dasselbe Kontrollkästchen aktiviert ist, wird es für ein anderes deaktiviert.

Andere Tipps

Dieser Änderungsstatus-Listener handelte auf diese Weise auf diese Weise, dann nur dann, wenn Sie einen ListView scrollen, da der GetView-Anruf erneut angezeigt wird, wodurch das überprüfte Kontrollkästchen Status checkchangedlistner-Anruf ändert, der Wert in der Datenbank ändert.Und wenn Sie eingereicht haben, dass Ihr Problem gelöst ist, da bei Ihnen Änderungen ListView OnClick-Ereignis nicht feuern, die Ihren Datenbankwert nicht ändern.

Sie können dieses Problem beheben, indem Sie den Viewinhaber in ListView verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top