wake-up-neo.com

onCheckedChanged wird automatisch aufgerufen

Ich habe einen Schalter in einem Recycling-Fenster, und Daten werden im Recycling-Fenster angezeigt, nachdem Daten von der DB abgerufen wurden. Wenn der Recyclerview geöffnet ist, lese ich DB und wenn ein Feld in DB "Y" ist, aktiviere ich den Schalter, oder ich deaktiviere den Schalter ..__ Wird nur aufgerufen, wenn der Benutzer den Schalter manuell einstellt.

Beim Öffnen wird die folgende Recyclingübersicht ausgeführt:

holder.enabledisable.setChecked(messengerRecord.get_is_valid().equalsIgnoreCase("Y"));

ViewHolder-Klasse:

public class viewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener{
public SwitchCompat enabledisable;
 public viewHolder(View v) {
            enabledisable = (SwitchCompat) v.findViewById(R.id.enabledisable);
            enabledisable.setOnCheckedChangeListener(this);
...................................
...................................

OncheckedChanged-Methode, die aufgerufen wird, wenn die RecyclerView gerade geöffnet wird:

@Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Log.v("ranjith","called oncheckedchanged");
            MessengerRecord rec;
            rec = dbHelper.getRecord(descview.getText().toString());
            switch (buttonView.getId()) {
                case R.id.enabledisable:
                    if (isChecked) {
                        rec.set_is_valid("Y");
                        dbHelper.updateRecord(rec);
                     }
}

In der Layoutdatei:

<Android.support.v7.widget.SwitchCompat
    Android:layout_marginRight="16dp"
    Android:layout_marginEnd="16dp"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:focusable="false"
    Android:id="@+id/enabledisable"
    Android:layout_alignRight="@+id/textview_to"
    Android:layout_alignEnd="@+id/textview_to"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentEnd="true"/>
55
Psypher

Es ist seltsam, dass wir alle dieses Problem haben, aber keine offizielle Google-Antwort auf dieses einfache Problem.

Am einfachsten ist es zu prüfen:

buttonView.isPressed()

Bei true bedeutet, dass der Benutzer auf die Ansicht geklickt hat.

Keine globalen Variablen erforderlich.

Hoffe das hilft.

195
Sulfkain

Ich habe diese Unterklasse von SwitchCompat verwendet, um dieses Problem zu vermeiden. Auf diese Weise brauche ich keinen Boilerplate-Code, bei dem ich diese Klasse verwende. Wenn Sie das Kontrollkästchen ändern müssen, ohne den Listener abzufeuern, verwenden Sie setCheckedSilent anstelle von setChecked

import Android.content.Context;
import Android.os.Parcelable;
import Android.support.v7.widget.SwitchCompat;
import Android.util.AttributeSet;

/**
 * Created by emanuel on 30/5/16.
 */
public class Switch extends SwitchCompat {

    private OnCheckedChangeListener listener;

    public Switch(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        this.listener = listener;
        super.setOnCheckedChangeListener(listener);
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        super.setOnCheckedChangeListener(null);
        super.onRestoreInstanceState(state);
        super.setOnCheckedChangeListener(listener);
    }

    public void setCheckedSilent(boolean checked) {
        super.setOnCheckedChangeListener(null);
        super.setChecked(checked);
        super.setOnCheckedChangeListener(listener);
    }
}

onRestoreInstanceState löste auch das Hören aus, wenn in der onViewCreated-Methode festgelegt wurde und Sie zu einem vorherigen Fragment zurückkehren .. _. Hoffe, es funktioniert für Sie!

11
Emanuel Andrada

Versuche dies

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (buttonView.isPressed()) {
          ... //returns true, if user clicks the switch button        
        }}
3
Shyam Kumar

Das funktioniert für mich:

    <pre> 


 boolean selected = preferences.isChecked();
        yourCheckBox.setOnCheckedChangeListener(new 
            CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, 
            boolean isChecked) {
                    if (buttonView.isPressed()) {
               preferences.setChecked(isChecked);
                    } else {
                        yourCheckBox.setChecked(selected);
                    }
                }
            });
    <code>
0
Dima Zatolokin

Im ViewPager-Bildschirm gab es für Fragmente dasselbe Problem. Wenn wir zwischen Fragmenten wechseln, wird der onCheckedChanged Listener immer wieder aufgerufen.

Wenn noch jemand nach diesem Problem sucht, versuchen Sie es bitte.

@Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (buttonView.isInTouchMode()) {
              ... //Your code will come here.         
            }
}
0
Arthur

verwenden Sie eine globale boolesche Variable. Wenn Daten aus der DB gelesen werden, setzen Sie sie auf "true" und nach "check" (wenn) in onCheckChange erneut auf "false". in der ersten Methode der Methode onCheckChange prüfen, ob diese Variable "false" ist, Ausführungscodes "else" return (Standardwert dieser Variablen muss "false" sein);

@Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     if(!isSourceDB){ 

       Log.v("ranjith","called oncheckedchanged");
        MessengerRecord rec;
        rec = dbHelper.getRecord(descview.getText().toString());
        switch (buttonView.getId()) {
            case R.id.enabledisable:
                if (isChecked) {
                    rec.set_is_valid("Y");
                    dbHelper.updateRecord(rec);

          }
    }//end if
  isSourceDB = false; }// end oncheckedchange
0
mk72