La mia soluzione era molto simile a s @epool' tranne modello di utilizzo EventBus.
In primo luogo, creare un RxBus: RxBus.java
public class RxBus {
private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());
public void send(Object o) { _bus.onNext(o); }
public Observable<Object> toObserverable() { return _bus; }
public boolean hasObservers() { return _bus.hasObservers(); }
}
Allora, avete due modi per utilizzare RxBus. Crea la tua classe Application personalizzata con riferimento RxBus o crea RxBus in Activity/Fragment e poi passa ad adapter. Io uso il primo
MyApp.java
public class MyApp extends Application {
private static MyApp _instance;
private RxBus _bus;
public static MyApp get() { return _instance; }
@Override
public void onCreate() {
super.onCreate();
_instance = this;
_bus = new RxBus();
}
public RxBus bus() { return _bus; }
}
quindi utilizzare
MyApp.get().bus()
per ottenere un'istanza RxBus.
L'utilizzo di RxBus in Adpater era come questo:
public class MyRecyclerAdapter extends ... {
private RxBus _bus;
public MykRecyclerAdapter (...) {
....
_bus = MyApp.get().bus();
}
public ViewHolder onCreateViewHolder (...) {
_sub = RxView.longClicks(itemView) // You can use setOnLongClickListener as the same
.subscribe(aVoid -> {
if (_bus.hasObservers()) { _bus.send(new SomeEvent(...)); }
});
}
}
è possibile inviare qualsiasi classe con _bus.send(), che riceveremo nell'attività:
RxBus bus = MyApp.get().bus(); // get the same RxBus instance
_sub = bus.toObserverable()
.subscribe(e -> doSomething((SomeEvent) e));
Informazioni sull'iscrizione.
In MyRecyclerAdapter, chiamare _sub.unsubscribe() nei metodi clearup() e chiamare _sub.unsubscribe() in Activity onDestory().
@Override
public void onDestroy() {
super.onDestroy();
if (_adapter != null) {
_adapter.cleanup();
}
if (_sub != null) {
_sub.unsubscribe()
}
}
È possibile utilizzare un Publis hSubject. Quindi lo crei solo una volta e ti basta emettere dati su di esso, pur avendo sottoscritto una sola volta. – Pavlos