OnCheckedChanged se llama automáticamente

Tengo un interruptor en un recyclerview y los datos se muestran en el recyclerview después de recuperar datos de DB. Cuando se abre la vista de reciclaje, leo DB y si un campo en DB es "Y", habilito el conmutador o bien desactivo el conmutador. Ahora el problema es junto con el oyente onCheckedchanged también se llama, quiero que el onCheckedChanged para ser llamado sólo cuando el usuario establece el cambio manualmente.

Al abrir el sitio de reciclaje abajo se ejecuta:

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

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

OncheckedChanged método que se llama cuando el recyclerView acaba de abrirse:

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

En el archivo de diseño:

 <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"/> 

Es extraño que todos tenemos este problema, pero no la respuesta oficial de Google a este simple problema.

Lo más simple es comprobar:

 buttonView.isPressed() 

Si es true, significa que el usuario ha hecho clic en la vista.

No se necesitan variables globales.

Espero que esto ayude.

He terminado usando esta subclase de SwitchCompat para evitar este problema. De esta manera no necesito un código estandarizado donde esté usando esta clase. Siempre que necesite cambiar el comprobado sin disparar al oyente, use setCheckedSilent lugar de 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 estaba activando la escucha también, cuando se establece en el método onViewCreated y se está volviendo a un fragmento anterior. ¡Espero que funcione para ti!

Utilice una variable booleana global y cuando lea un dato de DB establezca "true" y después de chequear (si) en onCheckChange vuelva a establecerlo como "false". In first of onCheckChange verifica si esta variable es falsa execute code else return (el valor por defecto de esta variable debe ser falso);

 @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 

Me enfrenté al mismo problema dentro de la pantalla de ViewPager para los fragmentos. Cuando cambiamos entre fragmentos, onCheckedChanged Listener se llama una y otra vez.

Si alguien sigue buscando este problema, inténtelo.

 @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isInTouchMode()) { ... //Your code will come here. } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.