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