Question:
quel opérateur ou transformer devrais-je utiliser pour combiner deux flux de données en plus petite quantité de code et de la manière la plus efficace?RxJava - deux sources Observable, combiner sortie uniquement sur certaines valeurs
ViewPager, RxBinding, flux d'événements
Avec un Android ViewPager, j'observe les événements (en utilisant RxBinding)
1) OnPageSelected (page actuellement visible)
Observable<Integer> pageSelectObs = RxViewPager.pageSelections(mPlaceImageViewPager);
et
2) OnPageScrollStateChanged (balayage de départ = 1, en mouvement = 2, complet = 0)
Observable<Integer> scrollStateObs = RxViewPager.pageScrollStateChanges(mPlaceImageViewPager);
Le flux de Entiers ressemble à ceci:
I/System.out: Page: 0 ScrollState: 1
I/System.out: Page: 0 ScrollState: 2
I/System.out: Page: 1 ScrollState: 2
I/System.out: Page: 1 ScrollState: 0
I/System.out: Page: 1 ScrollState: 1
I/System.out: Page: 1 ScrollState: 2
I/System.out: Page: 2 ScrollState: 2
I/System.out: Page: 2 ScrollState: 0
Je suis seulement intéressé lorsque:
- ScrollState == 0
- fin de ViewPager est atteinte
Code actuel
Voilà comment je suis en train d'observer:
Disposable d = ObservableCombineLatest.combineLatest(pageSelectObs, scrollStateObs, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(@NonNull Integer pageSelected, @NonNull Integer scrollState) throws Exception {
AUtils.logSystem(TAG, "Page: %s ScrollState: %s", pageSelected, scrollState);
if (adapter.isLastVisibleItem(pageSelected) && adapter.hasHiddenItemsRight() && scrollState == 0) {
return 1;
}
if (adapter.isFirstVisibleItem(pageSelected) && adapter.hasHiddenItemsLeft() && scrollState == 0) {
return -1;
}
return 0;
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(@NonNull Integer doAction) throws Exception {
if (doAction == -1) {
AUtils.logSystem(TAG, "shift LEFT");
adapter.shiftLeft();
}
if (doAction == 1) {
AUtils.logSystem(TAG, "shift RIGHT");
adapter.shiftRight();
}
}
});
est-il un moyen plus simple de faire ce qui précède?
Pourquoi vérifiez-vous ceci: adapter.isLastVisibleItem (pageSelected) && adapter.hasHiddenItemsRight()? –
Je change l'ensemble de données en fonction de la page. – Baker