CheckBox:屏蔽setChecked方法对OnCheckedChangeListener的影响

对于CheckBox的OnCheckedChangeListener,有两种情况下会被触发:

(1)用户点击了一下CheckBox;

(2)代码中调用了setChecked(boolean checked)方法,并且参数checked与CheckBox原始的选中状态不一致。

有时候,需要只监听(1)的事件,而忽略(2)的事件。

事实上,这种需求十分常见。例如,页面中有一个列表,列表中有多个checkBox供用户选择,同时页面有一个全选功能的checkBox。

(a)当用户将全选checkBox选上时,需要把列表中所有的checkBox都选上;

(b)当用户将全选checkBox取消选择时,需要把列表中所有的checkBox都选取消选择;

(c)如果当前是全选状态,只要用户任意取消选择了列表中一个checkBox,则将全选按钮取消选择。

这时候问题就出现了:执行(c)时,需要对全选的checkBox.setChecked(false),而这会调用全选按钮的OnCheckedChangeListener,由于(b)的原因,列表中所有的checkBox都会被取消选择,这不是期望的结果。

为了解决这个问题,有两种方法:

方案(1):

程序中定义一个全局变量boolean ignoreChange,然后,调用setChecked方法时改变ignoreChange的值:

ignoreChange = true;
selectAllCB.setChecked(true);
ignoreChange = false;

然后在selectAllCB的OnCheckedChangeListener中对ignoreChange进行判断:

selectAllCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (!ignoreChange) {
                    //do something
                }
            }
        });

方案(2):

对于checkBox不注册OnCheckedChangeListener,而直接注册OnClickListener,

checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean checked = ((CheckBox) v).isChecked();
                Toast.makeText(CheckBoxTest.this, "isChecked?" + checked, Toast.LENGTH_SHORT).show();
            }
        });

问题完美解决。

时间: 2024-11-08 00:02:48

CheckBox:屏蔽setChecked方法对OnCheckedChangeListener的影响的相关文章

解决重写父类的方法且不会影响继承的子类的问题

基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口. 但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:) 首先做几个实验验证: 提供的源码如下: A类  B类  C类  (B类继承于A类,C类继承于B类) // // A.h // Super // // Copyright (c) 2014年 Y.X. All r

winfrom 中datagridview中checkbox的使用方法

private void dgdv_skjs_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex != -1) { DataGridViewCheckBoxCell checkCell_rxwk = (DataGridViewCheckBoxCell)dgdv_skjs.Rows[e.RowIndex].Cells["rxwk"]; DataGridViewCheckBoxCell

setChecked方法触发onCheckedChanged监听器问题

有时需要在程序初始化界面时,讲有些例如toggleButton等控件按照需求勾选,此时会发现,当我setChecked时会触发onCheckedChanged监听器,导致这部分代码被调用两次.解决方法时区分开人为点击和setChecked,在监听器中加入一个判断,是否按下: @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated me

js获取checkbox值的方法

js获取checkbox值的方法.分享给大家供大家参考.具体实现方法如下:<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>js</title> </head> <script language="javascript"> functio

手动修复OneDrive的DNS污染屏蔽的方法

随着云计算的发展和微软云战略的持续推进,使用网盘进行文档存储.协同编辑与共享已成为文档操作的新流程.而Office.Office 365和OneDrive等微软产品是Windows用户的首选.但由于国内对Ondrive的DNS污染屏蔽,导致在浏览器端无法使用OneDrive的情况发生,跟用户到来极大不便.下面介绍的就是手动修复OneDrive的DNS污染屏蔽的方法. 对于使用Windows 7版本以上用户以“管理员身份”打开记事本. File=>Open,浏览到“C:\Windows\Syste

OCulus Rift的屏蔽警告方法实测

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/45870243 作者:cartzhang OCulus头盔的屏蔽警告方法实测 一.     关于警告 OC头盔的健康与安全警告,是官方的提示.对新用户来说,第一次使用至少要显示15秒的时间.警告和提醒都是很必要多. 所以,请在你已知安全的情况下,屏蔽此警告.   我们将要屏蔽的东西是这个,如下图: 或者这样 二.     屏蔽

80端口被屏蔽解决方法,80端口穿透之NAT端口映射技术

介绍一种NAT端口映射技术应用,达到80端口穿透目的,解决80端口被屏蔽的问题,也是80端口被屏蔽解决方法中经常用到的. 80端口穿透类似80端口转发,因为80端口被屏蔽,在数据层面来说是不能直接访问的,但通过端口转发后,在数据层是转发,用户访问是直接访问. 80端口穿透之NAT端口映射技术应用: 一,在局域网内启用nat123端口映射.添加映射.这一步虽然简单便很重要.映射时,外网地址使用自己的域名,外网端口直接写定是80端口. 二,映射后,访问下网站地址,不带端口的外网地址,是正常的.之后,

DevExpress Grid使用checkBox选中的方法

到官网得到消息自13.2版本后的Dev Grid中均内置了CheckBox列多选功能.在寻找答案的过程的成果进行记录. 一.13.2版本以后用法 启用多选列对Gird中的View进行以下属性设置: gridView1.OptionsSelection.MultiSelect = true; gridView1.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect; 清除当前选择在选中列时后,可配置在选中列

交换基本数据类型的方法swap,并影响到主方法

不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下: public static void main(String[] args) { Integer a = 1; Integer b = 2; System.out.println("交换前:a="+a+",b="+b); swap(a,b); System.out.println("交换后:a="+a+",b="+