android android-recyclerview oncheckedchanged android-switch switchcompat

android - onCheckedChanged llamado automáticamente



android-recyclerview android-switch (6)

Enfrenté el mismo problema dentro de la pantalla ViewPager para fragmentos. Cuando cambiamos entre fragmentos, se llama a onCheckedChanged Listener una y otra vez.

Si alguien sigue buscando este problema, pruébelo.

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isInTouchMode()) { ... //Your code will come here. } }

Tengo un interruptor en una vista de reciclador y los datos se muestran en la vista de reciclado 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 interruptor o de lo contrario lo deshabilito. Ahora el problema es que también se llama al oyente onCheckedchanged, quiero que se llame al onCheckedChanged solo cuando el usuario configura el interruptor manualmente.

Al abrir la vista de reciclado a continuación 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); ................................... ...................................

Método OncheckedChanged que se invoca cuando se acaba de abrir recyclerView:

@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 tengamos este problema, pero no la respuesta oficial de Google a este simple problema.

Lo más simple es verificar:

buttonView.isPressed()

Si es verdadero, significa que el usuario hizo clic en la vista.

No se necesitan variables globales.

Espero que esto ayude.


Esto funciona para mi:

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


Prueba esto

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isPressed()) { ... //returns true, if user clicks the switch button }}


Terminé usando esta subclase de SwitchCompat para evitar este problema. De esta manera no necesito código repetitivo donde estoy usando esta clase. Siempre que necesite cambiar el marcado sin disparar el 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, cuando se estableció en el método onViewCreated y está volviendo a un fragmento anterior. ¡Espero que funcione para ti!


use una variable booleana global y cuando lea un dato de la base de datos, configúrelo "verdadero" y después de verificar (si) en onCheckChange configúrelo "falso" nuevamente. en primer lugar del método onCheckChange, compruebe si esta variable es falsa, ejecute códigos de lo contrario, devuelva (el valor predeterminado 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