谈谈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)
上一篇 2022年5月2日 上午6:40
下一篇 2022年5月2日 上午6:40


相关推荐

  • Python常用数据结构之heapq模块建议收藏

    heapq堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值常用方法常用方法示例>>>[15,2,50,3

    2021年12月18日
    44
  • Stream和parallelStream

    Stream和parallelStreamStream和parallelStreamParallelStreamstreamparallelstreamstream和parallelStream一.什么是Stream?Stream是在Java8新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。二.和Iterator的区别Iterator做为迭代器,其按照一定的顺序迭代遍历集合中的每一个元素,并且对每个元素进行指定的操作。

    2022年7月19日
    16
  • 欧拉回路是简单回路_欧拉回路的充分必要条件

    欧拉回路是简单回路_欧拉回路的充分必要条件题目大意就是让你对有向图和无向图分别求欧拉回路非常的模板,但是由于UOJ上毒瘤群众太多了所以你必须加上一个小优化就是每次访问过一个边就把它删掉有点像Dinic的当前弧优化的感觉注意是在dfs完一个节点把当前的边加入到栈里面然后输出的时候为了保证原来的顺序就直接弹栈就好了//Author:dream_maker#includeusingnamespacestd;//————–…

    2025年7月14日
    7
  • 加多宝首度披露"换头手术"的详细内幕

    加多宝首度披露"换头手术"的详细内幕12月下旬,加多宝与王老吉的“改名案”和“怕上火案”判决结果先后出台,两大凉茶巨头之间的官司纠纷再起波澜。而加多宝集团品牌管理部负责人王月贵,在出席活动时首度披露了加多宝“换头手术”的详细内幕——由此,加多宝打赢凉茶之战的始末得以首次公开。以下为发言及访谈摘要:  快速出击,跟时间赛跑  在2012年,就在我们红罐凉茶迅速成长的时候,加多宝突然遭遇品牌地震,我们被迫放弃了使用和推广了17

    2025年6月30日
    5
  • 【10】进大厂必须掌握的面试题-版本控制面试

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 Q1。什么是版本控制? 这可能是您在面试中最容易遇到的问题。我的建议是首先给出版本控制的定义。它是一个记录一段时间内…

    2021年6月23日
    88
  • Midjourney 应用场景3:App & 徽章 Logo

    Midjourney 应用场景3:App & 徽章 Logo

    2026年3月15日
    2

发表回复

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

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