从侦听器列表中删除侦听器

时间:2019-03-25 12:31:24

标签: 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");
    }
}

如下面的图片所示,它可以识别具有相同lamba地址的相同类,但不会删除。

enter image description here

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

1 个答案:

答案 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的两个选项:

  1. addEventListener中自己生成ID,并将其返回给呼叫者, 将侦听器存储在地图中而不是列表中,关键是ID。当有人 想要删除一个侦听器,他将发送生成的ID,您将删除 从活动的听众地图中获取。
  2. 自己在addEventListener中生成ID,并将其保存在EventListener ID属性中,其他任何人都无法更改。然后,要删除特定的侦听器,只需实现一个equals方法来检查ID属性。