我在recyclerview中有一个开关,在从DB检索数据后,数据显示在recyclerview中。打开recyclerview时,我读DB,如果DB中的字段是“Y”,我启用开关,否则我禁用开关。 现在问题是它还调用了onCheckedchanged侦听器,我希望仅在用户手动设置开关时才调用onCheckedChanged。
打开下面的recyclerview时执行:
holder.enabledisable.setChecked(messengerRecord.get_is_valid().equalsIgnoreCase("Y"));
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);
...................................
...................................
刚刚打开recyclerView时调用的OncheckedChanged方法:
@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);
}
}
在布局文件中:
<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"/>
答案 0 :(得分:204)
奇怪的是,我们所有人都有这个问题但谷歌没有正式回答这个简单的问题。
最简单的检查是:
buttonView.isPressed()
如果为true,表示用户点击了视图。
不需要全局变量。
希望这有帮助。
答案 1 :(得分:12)
我最终使用SwitchCompat的这个子类来避免这个问题。这样我就不需要样板代码了,我正在使用这个类。
每当您需要更改已选中而不触发侦听器时,请使用setCheckedSilent
而不是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
在onViewCreated
方法中设置并且您将返回到之前的片段时也会触发侦听。
希望它适合你!
答案 2 :(得分:5)
尝试一下
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isPressed()) {
... //returns true, if user clicks the switch button
}}
答案 3 :(得分:3)
由于 RecyclerView
是回收视图,因此在为新项目的 OnCheckedChangeListener
设置选中值时可以触发先前附加的 Switch
。
将新数据绑定到项目时:
switch.setOnCheckedChangeListener(null) // remove any existing listener from recycled view
switch.isChecked = [true/false] // will no longer trigger any callback to listener
switch.setOnCheckedChangeListener { btnView, isChecked ->
// do exiting stuff
}
答案 4 :(得分:0)
使用全局布尔变量,当从DB读取数据时将其设置为“true”,并在onCheckChange中检查(if)后再次将其设置为“false”。在onCheckChange方法的第一个方法中检查此变量是否为false执行代码else返回(此变量的默认值必须为false);
@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
答案 5 :(得分:0)
我在ViewPager屏幕内遇到了与片段相同的问题。当我们在片段之间切换时,会一次又一次地调用onCheckedChanged Listener。
如果有人仍在寻找此问题,请尝试一下。
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isInTouchMode()) {
... //Your code will come here.
}
}
答案 6 :(得分:0)
这对我有用:
<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>
答案 7 :(得分:0)
Kotlin开发人员:
checkboxXYZ.setOnCheckedChangeListener { btnView, isChecked ->
if (btnView.isPressed) {
}
}