onCheckedChanged自动调用
我在回收站查看了一个开关,从数据库检索数据后,数据显示在recyclerview中。 当回收站打开时,我读DB,如果DB中的一个字段是“Y”,我启用开关,否则我禁用开关。 现在的问题是与此同时onCheckedchanged侦听器也被称为,我想只有当用户手动设置开关时调用onCheckedChanged。
打开下面的回收站时执行:
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"/>
这是奇怪的,我们都有这个问题,但不是官方谷歌回答这个简单的问题。
最简单的是检查:
buttonView.isPressed()
如果为true,则意味着用户点击了视图。
没有全局variables需要。
希望这可以帮助。
我已经结束了使用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
方法中设置,并且您将返回到以前的片段。 希望对你有帮助!
使用全局布尔variables,当从DB读取数据时将其设置为“true”,并且在onCheckChange中检查(if)之后再次将其设置为“false”。 在onCheckChange方法中首先检查这个variables是否为false执行代码else return(这个variables的默认值必须是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
我在ViewPager屏幕内部遇到了同样的问题。 当我们在片段之间切换时,onCheckedChanged监听器被一次又一次地调用。
如果有人仍然在寻找这个问题,请尝试一下。
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.isInTouchMode()) { ... //Your code will come here. } }