java - 从监听器列表中删除监听器

标签 java android list listener

我有一个函数可以将自定义监听器添加到同一触发事件。

所以同一个事件可以触发多个监听器,这是有效的。 我想要的是:如果我有 3 个监听器(例如)能够仅删除其中一个并让其他两个正常工作。

这是我添加事件的函数,它们位于 Map<String, CustomListener> 中变量。

void addEventListener(String eventName, EventListener eventListener) {
    List<eventListener> eventListenerList = new ArrayList<>();

    if (eventListenerMap.containsKey(eventName)) {
        eventListenerList = eventListenerMap.get(eventName);
    }
    Objects.requireNonNull(eventListenerList).add(eventListener);
    eventListenerMap.put(eventName, eventListenerList);
}

这是我要删除的函数

void removeEventListener(String eventName, EventListener eventListener) {
    if (eventListenerMap.containsKey(eventName)) {
        List<InsEventListener> eventListenerList = eventListenerMap.get(eventName);
        assert eventListenerList != null;
        eventListenerList.remove(eventListener);

        eventListenerMap.put(eventName, eventListenerList);
    }
    else {
        Log.w("Remove Event Listener:", "Event not found");
    }
}

如下图所示,它会识别具有相同 lba 地址的同一类,但不会删除。

enter image description here

Obs:所有监听器都在同一位置的同一函数中调用

最佳答案

这是因为 eventListenerList.remove(eventListener.getClass()); 没有删除任何内容。您不应该通过监听器的类来删除监听器,而是通过索引或通过将它们彼此区分的方法来删除监听器。
如果您检查了 remove() 返回值,您将得到 false,这意味着该参数不在该列表中。 oracle documentation .

In general an object can be removed in two ways from an ArrayList (or generally any List), by index (remove(int)) and by object (remove(Object)). reference here

您需要做什么:

将 equals(Object) 方法添加到您的 EventListener 类中。这将允许您执行 eventListenerList.remove(eventListener) 来识别正确的对象。

我认为最简单的方法是向您的 Parent 类添加一个 name 或 id 属性,该属性在所有监听器之间都是唯一的,并覆盖检查这些属性的 equals 。

您可以使用 Android Studio IDE 轻松生成 equals(object) 方法,按 Ctrl + O 并选择 equals 方法。

编辑:

我建议使用两种选项来处理听众的 ID:

  1. addEventListener中自己生成ID并将其返回给调用者, 将监听器存储在映射而不是列表中,键是 ID。当有人 想要删除一个监听器,他会发送生成的ID,你将删除 它来自事件的监听器 map 。
  2. addEventListener 中自行生成 ID,并将其保存在其他任何人都无法更改的 EventListener ID 属性中。然后,要删除特定监听器,您只需实现一个检查 ID 属性的 equals 方法即可。

关于java - 从监听器列表中删除监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337852/

相关文章:

java - 如何验证调用了非模拟方法?

安卓。如何从我的应用程序中读取 Aztec 代码?

javascript - 更高级的 TODO 列表,javascript

python - 如何加入Python中的链接以获得循环?

c# - 为什么接口(interface)类型的列表不能接受继承接口(interface)的实例?

java - Raspberry Pi 512MB 上的 Spigot 服务器因客户端连接被拒绝错误而失败

java - Tomcat 7 上的 Spring 应用程序问题

java - 如何获取java中的所有权限?

android - Unity3D隐形Canvas性能

android - 为什么 doctest 在 qpython3 中不起作用