android - sincronizar - no tienes permiso para acceder a los calendarios indicados
¿Cómo puedo configurar varios oyentes para un evento? (3)
Sé que es varios años tarde, pero quería agregar mi versión que solo pasé unas horas trabajando. Aquí está el código ubicado en el archivo 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();
}
}
}
es MUY importante que registeredListeners sea 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 OnCreate () del fragmento que debe actualizarse después de que se active el evento:
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 asíncrona que activa el evento en primer lugar:
dbUpdaterRegistry = new DBupdateEventListenerRegistry();
dbUpdaterRegistry.onUpdateChannelSubscriptions();
Quiero configurar múltiples escuchas para un evento, y he encontrado que usar la escucha compuesta es la clave.
¿Podría alguien darme un ejemplo?
puede probar este truco; deberá ampliar la vista; por ejemplo, extienda el botón para aceptar múltiples escuchas de un clic. creas 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 tu botón sub-clasificado, llamas super.setOnclickListener pasando una instancia de tu clase interna
private OnclickListenerCollection listenerCollector;
en tu constructor tienes:
listenerCollector = new OnclickListenerCollection();
super.setOnClickListener(listenerCollector);
reemplaza el método setOnclickListener para agregar escuchas a la colección
@Override
public void setOnClickListener(OnClickListener l) {
listenerCollector.addOnclickListener(l);
}
No lo he probado pero creo que funcionará
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);