我有一个将自定义侦听器添加到同一个触发器事件的函数。
所以同一个事件可以触发多个监听器,这是有效的。我想要的是:如果我有 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");
}
}
正如您在下图中所看到的,它识别具有相同 Lamba 地址的相同类,但不会删除。
Obs:所有监听器在同一个地方的同一个函数中被调用
那是因为eventListenerList.remove(eventListener.getClass());
没有删除任何东西。您不应该通过它们的类删除您的侦听器,而是通过索引或将它们与另一个区分开来的方法。
如果您检查remove()
返回值,您将得到 false,这意味着该参数不在该列表中。甲骨文文档。
通常,可以通过两种方式从
ArrayList
(或通常是任何列表)中删除对象,通过索引 (remove(int)) 和通过对象 (remove(Object))。参考这里
你需要做什么:
向您的EventListener
类添加一个 equals(Object) 方法。这将使您能够eventListenerList.remove(eventListener)
识别正确的对象。
我认为最简单的做法是向您的 Parent 类添加一个 name 或 id 属性,该属性在所有侦听器之间都是唯一的,并覆盖检查这些属性的 equals。
您可以equals(object)
使用 Android Studio IDE轻松生成方法,按 Ctrl + O 并选择 equals 方法。
编辑:
我建议使用两种方法来处理听众的 ID:
addEventListener
并返回给调用者,将监听器存储在map而不是list中,key就是ID。当有人想要删除一个监听器时,他会发送生成的 ID,你将从事件的监听器映射中删除它。addEventListener
并将其保存在EventListener
其他任何人都无法更改的ID 属性中。然后,要删除特定的侦听器,您只需要实现一个equals
检查 ID 属性的方法。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句