首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onCheckedChanged自动调用

onCheckedChanged自动调用
EN

Stack Overflow用户
提问于 2014-12-24 20:02:48
回答 10查看 29.8K关注 0票数 86

我有一个开关在回收视图和数据显示在回收视图后,检索数据从DB。当回收视图打开时,我读取DB,如果DB中的字段为"Y“,则启用开关,否则禁用开关。现在问题是,onCheckedchanged侦听器也会被调用,我希望只有当用户手动设置开关时才调用onCheckedChanged。

在打开回收视图时,将执行以下操作:

代码语言:javascript
复制
holder.enabledisable.setChecked(messengerRecord.get_is_valid().equalsIgnoreCase("Y"));

ViewHolder类:

代码语言:javascript
复制
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方法,在刚刚打开recyclerView时调用:

代码语言:javascript
复制
@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);
                     }
}

在布局文件中:

代码语言:javascript
复制
<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"/>
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2015-01-29 16:13:51

奇怪的是,我们所有的人都有这个问题,但不是官方的谷歌对这个简单的问题的答案。

最简单的方法是检查:

代码语言:javascript
复制
buttonView.isPressed()

如果为true,则意味着用户单击了视图。

不需要全局变量。

票数 276
EN

Stack Overflow用户

发布于 2018-06-28 13:40:18

尝尝这个

代码语言:javascript
复制
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (buttonView.isPressed()) {
          ... //returns true, if user clicks the switch button        
        }}
票数 15
EN

Stack Overflow用户

发布于 2016-05-30 23:27:44

最后,我使用了SwitchCompat的这个子类来避免这个问题。这样,我就不需要模板代码来使用这个类了。每当您需要在不触发侦听器的情况下更改检查时,请使用setCheckedSilent而不是setChecked

代码语言:javascript
复制
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方法中设置时,您将返回到前面的片段。希望它对你有用!

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27641705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档