Java 如何区分物理复选框单击和调用setChecked()?

Java 如何区分物理复选框单击和调用setChecked()?,java,android,android-listview,Java,Android,Android Listview,我有一个listview,每个列表项都包含一个复选框 我的列表适配器正在按照建议重新使用视图,因此它必须设置复选框的状态。它通过调用setChecked()。这会导致调用我的onCheckedChanged()方法。这很好,但是当用户实际单击复选框时,会调用相同的方法 这里的问题是,我想做一些不同的事情,这取决于单击是来自物理单击,还是来自对setChecked() 我曾想过重写onClick()并在该方法中设置一个标志,但不幸的是onClick()在onCheckedChanged()之后调用

我有一个listview,每个列表项都包含一个复选框

我的列表适配器正在按照建议重新使用视图,因此它必须设置复选框的状态。它通过调用
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框架一样向侦听器方法提供一个“事件源”参数,这将是一个非常好的选择,它可以作为一个区分因素。如果真的没有办法让框架区分这两种情况,那么我将不得不想出一些非常粗糙的解决方案