2011-03-28 16 views

Respuesta

40
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); 
+4

Es posible que desee agregar un método de eliminación, ya que eso también forma parte del patrón. – Swanand

5

puede intentar este truco tendrá que extender la vista, por ejemplo, Extienda el botón para aceptar múltiples oyentes onclick. se crea una clase interna que implementa 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); 
     } 

    } 
} 

en el constructor de ustedes botón sub-clasificado, que llame super.setOnclickListener pasar una instancia de la clase interna que

private OnclickListenerCollection listenerCollector; 

en su constructor que tiene :

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

reemplaza el método setOnclickListener añadir a los oyentes a la colección

@Override 
public void setOnClickListener(OnClickListener l) { 

    listenerCollector.addOnclickListener(l); 
} 

i no lo he probado, pero creo que va a trabajar

+5

No llamaría esto un truco. –

+0

Es una buena idea. En mi humilde opinión, se puede mejorar con un pequeño cambio. Como se describió, altera el significado de 'setOnClickListener'. El significado sería más claro si en su lugar implementara dos métodos cuyos nombres dicen lo que hacen: 'addOnClickListener' y' removeOnClickListener'. – ToolmakerSteve

1

Sé que es varios años de retraso, pero quería añadir mi versión que acabo de pasar un par de horas para llegar al trabajo. Aquí está el código ubicado en el DBupdateEventListener.java archivo:

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(); 
     } 
    } 
} 

Es muy, muy importante que registeredListeners es una variable estática pública. Esta es la razón por la que agregué mi propia respuesta a esta pregunta varios años después de que ya se había cerrado.

y aquí está el código que uso en el método del fragmento OnCreate() que debe ser actualizado después de que el evento se dispara:

 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); 

y aquí está el código utilizado en mi tarea asincrónica que los desencadenantes el evento en primer lugar:

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

'registeredListeners' solo necesita ser' estático' si no es un campo en un objeto que ya se sabe que se queda por el tiempo que sea necesario. Una desventaja de 'static 'es que ahora se mantendrá mientras su aplicación esté activa. Aunque a veces eso es bueno, no es una "receta" que usted quiera tener el hábito de usar. Una segunda desventaja de 'static 'es que ahora no puedes crear ** dos instancias ** de la clase, cada una con su propio grupo de oyentes. En cambio, en una actividad/fragmento, tenga un ** campo ** 'DBupdateEventListenerRegistry eventRegistry;', para los oyentes de esa actividad. – ToolmakerSteve

Cuestiones relacionadas