谈谈CompoundButton的OnCheckedChangeListener

谈谈CompoundButton的OnCheckedChangeListenerCompoundButton相信大家都很熟悉了。OnCheckedChangeListener相信大家也很熟悉。不过不知道大家有没有碰到类似的问题:在某个CompoundButton.OnCheckedChangeListener中请求网络接口。在其他一些地方,例如onCreate/onCreateView/setUserVisableHint等等方法中,从另一个接口取得数据,

CompoundButton相信大家都很熟悉了。

OnCheckedChangeListener相信大家也很熟悉。

不过不知道大家有没有碰到类似的问题:

在某个CompoundButton.OnCheckedChangeListener中请求网络接口。

在其他一些地方,例如onCreate/onCreateView/setUserVisableHint等等方法中,

从另一个接口取得数据,需要将取得的状态重新的给予这个CompoundButton。

然后会发现,每次从接口取得数据,也会调用一次设置数据的接口。

同时,也会发现,某些情况下(尤其是ViewPager中或者ListView/RecyclerView复用的时候),

控件初始化的时候,设置数据的接口也被调用了。并且设置的数据,是上一次的数据。

经过了分析,各种爬坑,最终发现,只要状态改变,不论是屏幕触摸(用户操作)做出的改变,

还是通过各种方法(setChecked/toggle)对其进行改变,都会回调OnCheckedChangeListener。

那么,我们现在的期望是,只有触摸事件才回调OnCheckedChangeListener,怎么办呢?

写一个类,继承自系统自带的CompoundButton。

并且重写方法:setChecked、setOnCheckedChangeListener、toggle

并且重载setChecked。

代码如下:

public class CustomSwitchCompat extends CompoundButton {
    private OnCheckedChangeListener mOnCheckedChangeListener;

    public CustomSwitchCompat(Context context) {
        super(context);
    }

    public CustomSwitchCompat(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomSwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setChecked(boolean checked) {
        setChecked(checked, true);
    }

    public void setChecked(boolean checked, boolean isCallBySelf) {
        if (isCallBySelf)
            setOnCheckedChangeListener(null);
        else
            setOnCheckedChangeListener(mOnCheckedChangeListener);
        super.setChecked(checked);
    }

    @Override
    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        mOnCheckedChangeListener = onCheckedChangeListener;
        super.setOnCheckedChangeListener(onCheckedChangeListener);
    }

    @Override
    public void toggle() {
        setChecked(!isChecked(), false);
    }
}

1、为什么需要重写setChecked呢?

为了使所有程序作出的状态改变操作,给重载方法传参。

2、为什么需要重写setOnCheckedChangeListener?

由于此类没有提供getOnCheckedChangeListener,为了获得并保存监听器

3、为什么需要重载setChecked呢?

通过传入的参数进行判定,来操控父类存储的OnCheckedChangeListener。

4、为什么重写toggle呢?

通过源码分析,发现Framework代码中,只被performClick这个方法所调用。因此令其传参给。

当然,也有一个其他的思路,直接不给父类对象setOnCheckedChangeListener。

在本地回调,也可以。


                                                        

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37978.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注