Как я могу настроить несколько слушателей для одного события? - PullRequest
24 голосов
/ 29 марта 2011

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

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

Ответы [ 3 ]

45 голосов
/ 29 марта 2011
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);
5 голосов
/ 12 февраля 2013

вы можете попробовать этот хак, вам нужно будет расширить представление, например, расширить кнопку, чтобы принять несколько прослушивателей по клику.вы создаете внутренний класс, который реализует 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);
}

я не пробовал, но я верю, что это будет работать

1 голос
/ 01 июня 2016

Я знаю, что уже несколько лет поздно, но хотел добавить свою версию, которую я потратил несколько часов, чтобы приступить к работе.Вот код, расположенный в файле 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();
        }
    }
}

, очень ОЧЕНЬ важно, чтобы зарегистрированный список переменных является общедоступной статической переменной.По этой причине я добавил свой собственный ответ на этот вопрос через несколько лет после того, как он уже был закрыт.

и вот код, который я использую в методе 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();
...