谈谈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://javaforall.net/133732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DropDownList绑定数据的几种方式

    DropDownList绑定数据的几种方式1.视图中添加可以直接通过单击属性"Items"后的按钮为某一DropDownList控件添加数据项。每添加一项数据就是添加了一个ListItem(列表控件中的数据项)。这种方式

    2022年7月3日
    26
  • 学习率衰减之余弦退火(CosineAnnealing)

    学习率衰减之余弦退火(CosineAnnealing)1引言当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosineannealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。在论文StochasticGradientDescentwithWarmRestarts中介绍主要介绍了带重启的随机梯度下降算法(SGDR),其

    2022年5月1日
    61
  • 京东面板搭建 青龙面板多容器的安装与使用2022年8月22日

    京东面板搭建 青龙面板多容器的安装与使用2022年8月22日系统环境的准备与Docker的安装首先需要准备一台服务器或VPS,当然自家能够安装Docker的路由器也可以,例如N1或OpenWrt等。代挂http://183.56.232.117:5701/下面以Centos为例国内一键安装Dockersudocurl-sSLhttps://get.daocloud.io/docker|shDocker安装(全家桶-推荐)wgethttps://ghproxy.com/https://raw.githubusercon.

    2026年1月19日
    4
  • Java分布式事务

    Java分布式事务分布式事务介绍事务拥有以下四个特性,习惯上被称为ACID特性:

    2022年6月14日
    32
  • maven报错was cached in the local repository, resolution will not be reattempted until the update inter

    maven报错was cached in the local repository, resolution will not be reattempted until the update inter

    2021年5月13日
    257
  • findIndex()方法[通俗易懂]

    findIndex()方法[通俗易懂]findIndex()方法返回数组中通过测试的第一个元素的索引(作为函数提供)。findIndex()方法对数组中存在的每个元素执行一次函数:如果找到函数返回true值的数组元素,则findIndex()返回该数组元素的索引(并且不检查剩余值)否则返回-1注释:findIndex()不会为没有值的数组元素执行函数。注释:findIndex()不会改变原始数组。获取数组中第一个值等于或大于18的元素的索引:varages=[3,10,18,20];funct

    2025年7月22日
    4

发表回复

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

关注全栈程序员社区公众号