我有一个将自定义监听器添加到同一触发事件的功能。
因此同一事件可以触发多个侦听器,这是有效的。 我想要的是:如果我有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地址的相同类,但不会删除。
糟糕:所有监听器都在同一位置的同一函数中调用
答案 0 :(得分:1)
这是因为eventListenerList.remove(eventListener.getClass());
没有删除任何内容。您并不是要按侦听器的类来删除侦听器,而是按索引或将它们彼此区分的方法来删除它们。
如果检查了remove()
返回值,则将得到false,这意味着该参数不在该列表中。 oracle documentation。
通常,可以用两种方式从索引
ArrayList
(或通常是任何列表)中删除对象,可以通过索引(remove(int))和按对象(remove(Object))删除。 reference here
您需要做什么:
向您的EventListener
类添加一个equals(Object)方法。这样您就可以eventListenerList.remove(eventListener)
来识别正确的对象。
我认为最简单的方法是向您的Parent类添加一个名称或id属性,该属性在所有侦听器之间都是唯一的,并覆盖用于检查这些属性的等号。
您可以使用Android Studio IDE轻松生成equals(object)
方法,按Ctrl + O并选择equals方法。
编辑:
我建议为听众处理ID的两个选项:
addEventListener
中自己生成ID,并将其返回给呼叫者,
将侦听器存储在地图中而不是列表中,关键是ID。当有人
想要删除一个侦听器,他将发送生成的ID,您将删除
从活动的听众地图中获取。addEventListener
中生成ID,并将其保存在EventListener
ID属性中,其他任何人都无法更改。然后,要删除特定的侦听器,只需实现一个equals
方法来检查ID属性。