从多个类调用setOnClickListener只会导致一个回调吗?

时间:2012-03-27 01:16:41

标签: android listview android-view onitemclicklistener onclicklistener

我希望能够动态更改OnItemClickListener ListView。但是,API并不清楚这是否可以接受,也不清楚如果我这样做会产生什么结果。

我想要的是,如果我从一个类调用listView.setOnItemClickListener(),然后再从另一个类调用,那么只有最近的类才能获得回调。

这个问题顺便提一下也适用于SetOnClickListener()

可以实现API以这种方式运行,但也可以实现它,以便所有调用setOnItemClickListener的类都获得回调。

Android API实际实现了哪些行为?

3 个答案:

答案 0 :(得分:9)

查看AdapterView.setOnItemClickListener()源代码here

/**
 * Register a callback to be invoked when an item in this AdapterView has
 * been clicked.
 *
 * @param listener The callback that will be invoked.
 */
public void setOnItemClickListener(OnItemClickListener listener) {
    mOnItemClickListener = listener;
}

在Java世界中,通常setter方法将刷新先前的值并将对象的实例变量设置为新值。因此,您所谈论的行为是 ,只有最新的类才能获得回调。


  

它可能实现为调用setOnItemClickListener的所有类都获得回调。

在Java世界中,这也是可能的,在这种情况下,作为一个好的OOP实践,我们通常将其命名为addOnItemClickListener(),更具体地说,在实际实现中使用Listener List / manage multiply listener。这不是AdapterView.setOnItemClickListener()在API中实现的方式。

答案 1 :(得分:4)

您可以根据需要随意setOnItemClickListener(),只使用最新的OnItemClickListener。

答案 2 :(得分:0)

String className = "MyOnClickListener";
obj = (OnClickListenerInterface)( Class.forName( className).newInstance() );

您必须为侦听器创建一个接口,但是您可以在不同的clasess中实现不同的侦听器,然后动态调用它们中的每一个,如此代码部分所示。