问题:
我应该使用哪个运算符或转换以最少量的代码和最有效的方式组合两个数据流?
ViewPager、RxBinding、事件流
使用 Android ViewPager,我正在观察事件(使用 RxBinding)
1) OnPageSelected (页面当前可见)
Observable<Integer> pageSelectObs = RxViewPager.pageSelections(mPlaceImageViewPager);
和
2)OnPageScrollStateChanged(滑动开始 = 1,运动中 = 2,完成 = 0)
Observable<Integer> scrollStateObs = RxViewPager.pageScrollStateChanges(mPlaceImageViewPager);
整数流如下所示:
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
我只对以下情况感兴趣:
- 滚动状态 == 0
- 到达 ViewPager 的末尾
当前代码
这是我目前观察的方式:
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();
}
}
});
有没有更简单的方法来完成上述操作?