我有ViewPager
有两页,即热门和全部。我想要实现的目标只是将热门标签推送到热门,而将所有项目推送到全部。
目前我有一个在PagerAdapter
中使用并传入页面类型的类。如何过滤掉PublishSubject
,以便每个页面仅相应地显示必要的项目。
我的Observer都订阅了一个
PublishSubject
,但是我 想要在发光时过滤。
如果问题不清楚,请发表评论。我会尽力传达这个问题。如果它已经被回答,也很抱歉,因为我找不到任何相关内容。
我使用的代码this基于this architecture,其中我有一个Firebase数据存储FirebaseSubscriptionDataStore,提供PublishSubject
。稍后由SubscribeToSubscriptionUpdates
提前致谢。
答案 0 :(得分:2)
您基本上可以定义两种不同的方法来从Observable
获取PublishSubject
(或Flowable)。第一个可观察物将发射所有物品,第二个仅发射受欢迎物品:
public class DataStore {
private PublishSubject<DataItem> dataItemPublishSubject = PublishSubject.create();
public Flowable<DataItem> getAllObservable() {
return dataItemPublishSubject.toFlowable(BackpressureStrategy.BUFFER);
}
public Flowable<DataItem> getPopularObservable() {
return dataItemPublishSubject.toFlowable(BackpressureStrategy.BUFFER)
.filter(new Predicate<DataItem>() {
@Override
public boolean test(DataItem dataItem) throws Exception {
return dataItem.popular;
}
});
}
public static class DataItem {
public final boolean popular;
public DataItem(boolean popular) {
this.popular = popular;
}
}
}
如果您不想使用两种方法,可以在您的Rx链中的任何地方移动.filter()
运算符,最终可能会出现以下情况:
dataStore.getAllObservable()
.doOnNext(new Consumer<DataStore.DataItem>() {
@Override
public void accept(DataStore.DataItem dataItem) throws Exception {
pagerAdapter.addDataAll(dataItem);
}
})
.filter(new Predicate<DataStore.DataItem>() {
@Override
public boolean test(DataStore.DataItem dataItem) throws Exception {
return dataItem.popular;
}
})
.doOnNext(new Consumer<DataStore.DataItem>() {
@Override
public void accept(DataStore.DataItem dataItem) throws Exception {
pagerAdapter.addDataPopular(dataItem);
}
})
.subscribe();