我有一个函数可以将自定义监听器添加到同一触发事件。
所以同一个事件可以触发多个监听器,这是有效的。 我想要的是:如果我有 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 地址的同一类,但不会删除。
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:
- 在
addEventListener
中自己生成ID并将其返回给调用者, 将监听器存储在映射而不是列表中,键是 ID。当有人 想要删除一个监听器,他会发送生成的ID,你将删除 它来自事件的监听器 map 。 - 在
addEventListener
中自行生成 ID,并将其保存在其他任何人都无法更改的EventListener
ID 属性中。然后,要删除特定监听器,您只需实现一个检查 ID 属性的equals
方法即可。
关于java - 从监听器列表中删除监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337852/