onCheckedChanged自动调用

Psy*_*her 67 android oncheckedchanged android-switch switchcompat android-recyclerview

我在recyclerview中有一个开关,在从DB检索数据后,数据显示在recyclerview中.打开recyclerview时,我读DB,如果DB中的字段是"Y",我启用开关,否则我禁用开关.现在问题是它还调用了onCheckedchanged侦听器,我希望只有当用户手动设置开关时才调用onCheckedChanged.

在打开时,执行下面的recyclerview:

holder.enabledisable.setChecked(messengerRecord.get_is_valid().equalsIgnoreCase("Y"));
Run Code Online (Sandbox Code Playgroud)

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);
...................................
...................................
Run Code Online (Sandbox Code Playgroud)

刚刚打开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);
                     }
}
Run Code Online (Sandbox Code Playgroud)

在布局文件中:

<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"/>
Run Code Online (Sandbox Code Playgroud)

Sul*_*ain 223

很奇怪我们所有人都有这个问题但谷歌官方没有回答这个简单的问题.

最简单的检查:

buttonView.isPressed()
Run Code Online (Sandbox Code Playgroud)

如果为true,表示用户单击了视图.

不需要全局变量.

希望这可以帮助.

  • 如果您非常快速地滑动Switch,解决方案将无效.愚蠢的谷歌 (13认同)
  • 浪费了很多天试图找出为什么onCheckedChanged被自动调用并抛弃我的单选按钮状态,这意味着让我的应用程序无用.感谢您指出一个简单而有效的解决方案.最后,我可以继续谈谈生活中的其他重要事情. (12认同)
  • 即使你慢慢刷它也不起作用. (6认同)
  • 这绝对有效.但是,如果用户滑动开关,是否有任何事件?在这种情况下,如果使用滑动开关,这不起作用. (4认同)

小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

onRestoreInstanceState当在onViewCreated方法中设置并且您将返回到先前的片段时,也会触发收听.希望这对你有用!


Shy*_*mar 10

尝试这个

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (buttonView.isPressed()) {
          ... //returns true, if user clicks the switch button        
        }}
Run Code Online (Sandbox Code Playgroud)

  • 如果滑动速度非常快,则此方法不起作用。 (2认同)

jay*_*kay 6

由于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
   }
Run Code Online (Sandbox Code Playgroud)