Java 如何区分物理复选框单击和调用setChecked()?
我有一个listview,每个列表项都包含一个复选框 我的列表适配器正在按照建议重新使用视图,因此它必须设置复选框的状态。它通过调用Java 如何区分物理复选框单击和调用setChecked()?,java,android,android-listview,Java,Android,Android Listview,我有一个listview,每个列表项都包含一个复选框 我的列表适配器正在按照建议重新使用视图,因此它必须设置复选框的状态。它通过调用setChecked()。这会导致调用我的onCheckedChanged()方法。这很好,但是当用户实际单击复选框时,会调用相同的方法 这里的问题是,我想做一些不同的事情,这取决于单击是来自物理单击,还是来自对setChecked() 我曾想过重写onClick()并在该方法中设置一个标志,但不幸的是onClick()在onCheckedChanged()之后调用
setChecked()。这会导致调用我的onCheckedChanged()
方法。这很好,但是当用户实际单击复选框时,会调用相同的方法
这里的问题是,我想做一些不同的事情,这取决于单击是来自物理单击,还是来自对setChecked()
我曾想过重写onClick()
并在该方法中设置一个标志,但不幸的是onClick()
在onCheckedChanged()之后调用
因此,如果需要,我可以发布代码,但基本问题是,如何区分更改复选框状态的物理单击和编程复选框状态更改?我过去这样做的方式是在复选框的所有者上有一个布尔属性,例如一个表单,通常称为inhibit
然后在事件处理程序中,如果它为真,则退出,当我想以编程方式设置属性set inhibit时,更改属性reset inhibit。PIA,但它有效 答案有点像是盯着我的脸。我已经将一些代码从onCheckedChanged()
移到了onClick()
,以编程方式设置复选框状态时不会调用它
@Override
public void onClick(View view) {
boolean isChecked = ((CheckBox)view).isChecked();
if (isChecked) {
// do something
}
else {
// do something else
}
}
谢谢,是的,这就是我要用布尔标志的地方。但由于种种原因,这种方法并没有奏效。如果Android框架像其他UI框架一样向侦听器方法提供一个“事件源”参数,这将是一个非常好的选择,它可以作为一个区分因素。如果真的没有办法让框架区分这两种情况,那么我将不得不想出一些非常粗糙的解决方案