我想为一个事件设置多个侦听器,并且发现使用复合侦听器是关键。
有人能举个例子吗?
答案 0 :(得分:45)
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);
答案 1 :(得分:5)
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);
}
我没有尝试过,但我相信它会起作用
答案 2 :(得分:1)
我知道它已经晚了几年,但是想要添加我刚刚上班几个小时的版本。以下是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();
}
}
}
registerListeners是一个公共静态变量非常重要。这就是我在关闭这个问题几年后我自己回答这个问题的全部原因。
这是我在片段的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();