web-dev-qa-db-ja.com

1つのイベントに複数のリスナーを設定するにはどうすればよいですか?

1つのイベントに複数のリスナーを設定したいのですが、複合リスナーを使用することが重要であることがわかりました。

誰かが私に例を教えてもらえますか?

25
Vicky
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);
47
Flavio

このハックを試すことができます。たとえば、ビューを拡張する必要があります。ボタンを拡張して、複数の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);
}

私はそれを試していませんが、私はそれがうまくいくと信じています

5
araoko

数年遅れていることは承知していますが、数時間かけて仕事に取り掛かったバージョンを追加したいと思いました。 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();
        }
    }
}

registeredListenersがパブリック静的変数であることが非常に重要です。これが、この質問がすでに閉じられてから数年後に私がこの質問に自分の答えを追加した理由です。

これは、イベントがトリガーされた後に更新する必要があるフラグメントの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();
1
Joe Ryan