Подтвердить что ты не робот

Как я могу настроить несколько прослушивателей для одного события?

Я хочу настроить несколько прослушивателей для одного события и обнаружил, что использование составного прослушивателя - это ключ.

Может ли кто-нибудь привести мне пример?

4b9b3361

Ответ 1

class CompositeListener implements OnEventListener {
   private List<OnEventListener> registeredListeners = new ArrayList<OnEventListener>();

   public void registerListener (OnEventListener listener) {
      registeredListeners.add(listener);
   }

   public void onEvent(Event e) {
      for(OnEventListener listener:registeredListeners) {
         listener.onEvent(e);
      }
   }
}

.....

CompositeListener composite = new CompositeListener();
composite.registerListener(listener1);
composite.registerListener(listener2);
component.setOnEventListener(composite);

Ответ 2

вы можете попробовать этот хак вам нужно будет расширить вид, например. добавьте кнопку, чтобы принять несколько прослушивателей onclick. вы создаете внутренний класс, который реализует OnclickListener

private class OnclickListenerCollection implements OnClickListener{
    private ArrayList<OnClickListener> listeners;

    public void addOnclickListener(OnClickListener listener){
        listeners.add(listener);
    }

    @Override
    public void onClick(View v) {
        for(OnClickListener l : listeners){
            l.onClick(v);
        }

    }
}

в конструкторе вашей подклассифицированной кнопки вы вызываете super.setOnclickListener, передавая экземпляр вашего внутреннего класса

private OnclickListenerCollection listenerCollector;

в вашем конструкторе у вас есть:

listenerCollector = new OnclickListenerCollection();
super.setOnClickListener(listenerCollector);

вы переопределите метод setOnclickListener, чтобы добавить слушателей в коллекцию

@Override
public void setOnClickListener(OnClickListener l) {

    listenerCollector.addOnclickListener(l);
}

Я не пробовал, но считаю, что он будет работать

Ответ 3

Я знаю, что прошло несколько лет, но мне хотелось добавить мою версию, что я потратил несколько часов на работу. Вот код, расположенный в файле DBupdateEventListener.java:

public interface DBupdateEventListener {
    public void onUpdateChannelSubscriptions();
}
class DBupdateEventListenerRegistry implements DBupdateEventListener{
    public static List<DBupdateEventListener> registeredListeners = new ArrayList<DBupdateEventListener>();
    public void registerListener(DBupdateEventListener listener){
        registeredListeners.add(listener);
    }
    public void onUpdateChannelSubscriptions(){
        for (DBupdateEventListener listener:registeredListeners){
            listener.onUpdateChannelSubscriptions();
        }
    }
}

Очень важно, чтобы зарегистрированныеListeners были общедоступной статической переменной. Вот почему я добавил свой собственный ответ на этот вопрос через несколько лет после того, как он уже был закрыт.

и вот код, который я использую в методе OnCreate() для фрагмента, который необходимо обновить после запуска события:

        dbUpdater = new DBupdateEventListener() {
            @Override
            public void onUpdateChannelSubscriptions() {
                //put the code you want to run when the event is triggered here:
                loadChannelListsFromDB();
            }
        };
        DBupdateEventListenerRegistry temp = new DBupdateEventListenerRegistry();
        temp.registerListener(dbUpdater);

и вот код, используемый в моей асинхронной задаче, которая запускает событие в первую очередь:

dbUpdaterRegistry = new DBupdateEventListenerRegistry();
dbUpdaterRegistry.onUpdateChannelSubscriptions();