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"/>
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.
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!
Versuche dies
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isPressed()) {
... //returns true, if user clicks the switch button
}}
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>
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.
}
}
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