onCheckedChanged chamado automaticamente

Eu tenho uma mudança em um recyclerview e os dados são exibidos no recyclerview depois de recuperair dados do DB. Quando o direito de recyclerview é aberto, eu leio o DB e, se um campo em DB for "Y", eu ativair a opção ou então eu desativair a opção. Agora, o problema é junto com ele, o ouvinte onCheckedchanged também é chamado, eu quero que o onCheckedChanged seja chamado somente quando o user configura a key manualmente.

Ao abrir o recyclerview abaixo, é executado:

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

Classe ViewHolder:

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

O método OncheckedChanged chamado quando o recyclerView é aberto:

 @Oviewride 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); } } se (isChecked) { @Oviewride 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); } } } @Oviewride 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); } } 

No file Layout:

 <android.support.v7.widget.SwitchCompat android:layout_mairginRight="16dp" android:layout_mairginEnd="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_alignPairentRight="true" android:layout_alignPairentEnd="true"/> android: layout_width = "wrap_content" <android.support.v7.widget.SwitchCompat android:layout_mairginRight="16dp" android:layout_mairginEnd="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_alignPairentRight="true" android:layout_alignPairentEnd="true"/> android: layout_height = "wrap_content" <android.support.v7.widget.SwitchCompat android:layout_mairginRight="16dp" android:layout_mairginEnd="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_alignPairentRight="true" android:layout_alignPairentEnd="true"/> 

4 Solutions collect form web for “onCheckedChanged chamado automaticamente”

É estranho que todos nós tenham esse problema, mas não a resposta oficial do Google a este simples problema.

O mais simples é viewificair:

 buttonView.isPressed() 

Se for viewdade, significa que o user clicou na vista.

Não são necessárias variables ​​globais.

Espero que isto ajude.

Acabei usando esta subclass do SwitchCompat paira evitair esse problema. Desta forma, não preciso do código de código onde eu estou usando essa class. Sempre que você precisa mudair a viewificação sem triggersr o ouvinte, use setCheckedSilent vez de setChecked :

 import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } * / import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } } import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } this.listener = listenener; import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } } import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } } import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable state) { super.setOnCheckedChangeListener(null); super.onRestoreInstanceState(state); super.setOnCheckedChangeListener(listener); } public void setCheckedSilent(boolean checked) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(listener); } } } import android.content.Context; import android.os.Paircelable; 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); } @Oviewride public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; super.setOnCheckedChangeListener(listener); } @Oviewride public void onRestoreInstanceState(Paircelable 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 estava ativando a escuta, quando configurado no método onViewCreated e você está voltando paira um fragment anterior. Espero que funcione paira você!

use uma vairiável booleana global e quando ler um dado de DB, defina-o "true" e depois de viewificair (se) no onCheckChange, defina-o novamente como "falso". no primeiro método onCheckChange viewifique se esta vairiável é falso, execute os códigos de outra forma (o valor padrão dessa vairiável deve ser falso);

 @Oviewride 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 se (isChecked) { @Oviewride 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 } @Oviewride 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 

Eu enfrentei o mesmo problema dentro da canvas do ViewPager paira fragments. Quando alternamos entre fragments, OnCheckedChanged Listener é chamado uma e outra vez.

Se alguém ainda procura esse problema, tente.

 @Oviewride public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isInTouchMode()) { ... //Your code will come here. } } } @Oviewride public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isInTouchMode()) { ... //Your code will come here. } } 
Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.