谈谈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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动态规划经典题目总结怎么写_动态规划例题及答案

    动态规划经典题目总结怎么写_动态规划例题及答案微信公众号在算法中,动态规划题目算是比较经典的一类题目。在找工作中,不管是笔试,还是面试,我们经常会遇到用动态规划来解决问题的情况,有时候面试官还需要我们现场手写出动态规划解法的代码。因此,在求职中能灵活的运用动态规划就相当重要了。下面我总结出了一些经典的动态规划题目,其中有些还是面试中遇到的。1.什么是动态规划【1】牛客网在线编程专题《剑指offer-面试题9》斐波那契数列【…

    2022年10月24日
    0
  • ODT入门_odt是什么

    ODT入门_odt是什么操作关键:推平一段区间cf896c题意:操作分四种,区间加上一个数、区间赋值、求区间第k小、求区间幂次和将序列中连续的相同的元素整合、用一个三元组(L,R,val)来表示set维护定义内部类:structnode{intl,r;//区间的左端点、右端点mutableLLv;//数值node(intL,intR=-1,LLV=…

    2022年9月9日
    0
  • 软件著作权的申请超详细图文怎么办_牛顿第二定详细内容图文

    软件著作权的申请超详细图文怎么办_牛顿第二定详细内容图文将自己申请软件著作权的申请流程记录下来,以备后用。以前软件著作权申请需要交费手续费,但是去年的出台了新的政策,软件著作权申请不在需要手续费用,尽管两三百元,但这也是一个福音,将自己申请软件著作权的流程记录下来;软件著作权的好处不言而喻,还是有一定含金量的,在说又不收费了,何乐不为?一、网址以及账号注册登录1.打开浏览器输入中国版权保护中心,以前是可以直接进入旧版网站的……

    2022年10月1日
    0
  • oracle创建表空间出错的原因和解决办法「建议收藏」

    oracle创建表空间出错的原因和解决办法「建议收藏」相信很多人在创建表空间的时候遇到过这样问题.问题原因:这是因为oracle数据库是在虚拟机或者是服务器上安装的.你在本地创建文件的时候自然会找不到文件夹.就会造成图上的错误解决办法:1.打开虚拟机2.连接上oracle数据库3.找到安装oracle文件夹的位置例如:D:\oracle11g\app\oracle\oradata\4.在cmd上敲命令:createtablespacetudoudatafile‘D:\oracle11g\app\oracle\orad…

    2022年7月11日
    18
  • pycharm怎么装第三方库jieba_pycharm安装配置教程

    pycharm怎么装第三方库jieba_pycharm安装配置教程一、测试环境测试机型:window10pycharm版本:2020.1.1专业版二、安装步骤1.打开pycharm,点击最上方菜单项中的File,并找到Setings如图:2.点击Setings,在Project中找到自己的项目(1),随后右边的显示框中会显示如图页面,点击ProjectInterpreter(2):3.点击之后就会出现如下图页面,中间表格中的Package表示你已经添加的包,Version表示当前版本,latestversion表示最新的版本。添加新.

    2022年8月25日
    1
  • mysql创建数据库的步骤_MySQL创建数据表

    mysql创建数据库的步骤_MySQL创建数据表MYSQL建立数据库的步骤:通过练习查询、创建数据库,并且向数据库内单个或通过txt文件批量插入数据的方法。

    2022年9月25日
    0

发表回复

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

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