谈谈CompoundButton的OnCheckedChangeListener
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);}@Overridepublic void setChecked(boolean checked) {setChecked(checked, true);}public void setChecked(boolean checked, boolean isCallBySelf) {if (isCallBySelf)setOnCheckedChangeListener(null);elsesetOnCheckedChangeListener(mOnCheckedChangeListener);super.setChecked(checked);}@Overridepublic void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {mOnCheckedChangeListener = onCheckedChangeListener;super.setOnCheckedChangeListener(onCheckedChangeListener);}@Overridepublic void toggle() {setChecked(!isChecked(), false);}
}
1、为什么需要重写setChecked呢?
为了使所有程序作出的状态改变操作,给重载方法传参。
2、为什么需要重写setOnCheckedChangeListener?
由于此类没有提供getOnCheckedChangeListener,为了获得并保存监听器
3、为什么需要重载setChecked呢?
通过传入的参数进行判定,来操控父类存储的OnCheckedChangeListener。
4、为什么重写toggle呢?
通过源码分析,发现Framework代码中,只被performClick这个方法所调用。因此令其传参给。
当然,也有一个其他的思路,直接不给父类对象setOnCheckedChangeListener。
在本地回调,也可以。
谈谈CompoundButton的OnCheckedChangeListener相关推荐
- android listview 切换,Android:在ListView适配器中切换OnCheckedChangeListener
我在我的应用程序中有一个listView.对于listView中的每个元素,它都有一个Switch.以前我在listView Adapter的getView方法中为Switch实现了一个onClick ...
- Android开发 CompoundButton CheckBox Switch RadioButton
1.CompoundButton 抽象了各种复合按钮的一个抽象类,继承自Button类. 2.CheckBox 复选框 有默认的复选框,设置宽高文字内容就可以直接用. 也可以在drawable下新建一 ...
- 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
ARP欺骗是一种非常古老的电子欺骗攻击,虽然从诞生到现在已经过去了二十多年,但在很多网络中仍然有效.之前写的 沈传宁:谈谈TCP/IP协议的学习zhuanlan.zhihu.com 文章中也提到,我 ...
- mysql注入实例获取答案_本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:问题解读我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,...
本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: se ...
- 谈谈C#中类成员的执行顺序.
今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序,这个地方向来是初学C#的人比较迷惑的地方,也是各大公司最喜欢拿来出面试题的地方. 下面我们分情况来分析. 1. 普通构造函数和静态构造函 ...
- 谈谈UI架构设计的演化
谈谈UI架构设计的演化 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Reenskaug在跟一些人的讨 ...
- 谈谈Python那些不为人知的冷知识(二)
本文转载自Python的编程时光(ID:Python-Time) 小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲 ...
- 谈谈 Java 类加载机制
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...
- 13个Offer,8家SSP,谈谈我的秋招经验
前言 大家好,我是卖萌屋的小Q,是夕小瑶学姐的同实验室师弟(2020届).在学姐的建(bian)议(ce)下写了本文,希望能够给21届的师弟师妹提供一些启发,秋招之路能够更加顺利~ 往昔的回忆使我们激 ...
- 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?
[每日一问]谈谈你对集成学习的见解与认识,描述一下它们的优势所在? Datawhale优秀回答者:HipHopMan 集成方法有很多种,一种叫做bagging,bagging的思想是,我把我的数据做一 ...
最新文章
- python怎么继承_Python: 如何继承str/string?
- 用leangoo做阶段式游戏新产品研发
- cad 快捷键命令大全
- php catch e是什么,php try catch 中的catch(Exception $e) 中的Exception 有什么作用?
- Java如何查看死锁?
- 软件工程---3.敏捷软件开发
- c mysql 异步查询_C#Mysql – 使用锁在数据库上查询异步等待服务器
- python 3d绘图立方体_python绘制3D立方体
- 《统计学》第八版贾俊平第三章课后答案Excel
- python淘宝自动发货源码_发货100虚拟商品自动发货系统下载
- linux 无线ap模式,在Linux(CentOS)上开启小度WIFI无线AP模式
- ViewBinding使用时出现Missing required view with ID: xxx 错误
- android.hardware.Camera 5.1之后操作照相机是不是不能用啦,我用小米手机(基本android 6.0)
- Redis源码初探(1)简单动态字符串SDS
- Android开发对内存管理的学习总结
- 厦门计算机大学排名,全国计算机专业大学排名
- 依赖注入的正确打开方式 bilibili/kratos × google/wire
- Flask-peewee-pyjwt实现简单的用户接口
- python股票代码示例_python实例:从excel读取股票代码,爬取股票信息写到代码后面的单元格中...
- 论语心得 04: 君子之道