我有一个函数将自定义侦听器添加到同一个触发器事件中。
所以同一个事件可以触发多个侦听器,这是可行的。我想要的是:如果我有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地址,但它不会删除。

所有的侦听器都在同一个地方调用相同的函数。
发布于 2019-03-25 12:46:44
这是因为eventListenerList.remove(eventListener.getClass());没有删除任何东西。您不应该通过类来删除侦听器,而是通过索引或区分它们的方法来删除它们。
如果检查remove()返回值,就会得到false,这意味着参数不在该列表中。oracle文档。
通常,对象可以通过两种方式从
ArrayList(或通常是任何列表)中删除,即索引(remove(int))和对象(remove( object ))。参考在这里
您需要做的:
向EventListener类中添加一个等于(对象)方法。这将允许您执行eventListenerList.remove(eventListener)来标识正确的对象。
我认为最简单的方法是在父类中添加一个名称或id属性,这个属性在所有侦听器之间都是唯一的,并且覆盖那些属性检查的等号。
您可以轻松地使用Android生成equals(object)方法,按Ctrl +O并选择相等的方法。
编辑:
我建议为侦听器处理ID的两个选项:
addEventListener中自己生成ID并返回给调用者,将侦听器存储在地图中而不是列表中,关键是ID。当有人想要删除侦听器时,他会发送生成的ID,而您将从事件的监听器映射中删除它。addEventListener中自己生成ID,并将其保存在其他任何人都无法更改的EventListener ID属性中。然后,要删除特定的侦听器,只需实现一个检查ID属性的equals方法。https://stackoverflow.com/questions/55337852
复制相似问题