2017-09-23 127 views
0

我有ViewPager两页,即热门全部。我试图实现的只是推动项目,有热门标签真正到热门而所有项目推到全部发布到特定的观察员使用PublishSubject

目前我有一个类用于PagerAdapter并传递页面类型。如何过滤掉PublishSubject,以便每个页面只显示相应的必需项目。

我的观察者都订阅了单个PublishSubject,但是我想要在发射时过滤我的 。

如果问题不清楚,请发表评论。我会尽我所能来传达这个问题。如果因为找不到任何相关信息而已经回答,也很抱歉。

我正在使用的代码是this基于this architecture其中我有一个火力地堡数据存储FirebaseSubscriptionDataStore其提供PublishSubject。这是后来订购SubscribeToSubscriptionUpdatesSubscriptionListPresenterImpl

在此先感谢。

+0

请显示一些代码,尤其是您订阅主题的PagerAdapter部分。 – skywall

+0

PagerAdapter没有任何相关的。我正在'ViewPager'绑定'Fragment'的onCreateView中订阅前面提到的'PublishSubject'。 – riteshakya037

+0

你如何从你的'ViewPager'中的父代片段提供数据到片段? – skywall

回答

1

您基本上可以定义两种不同的方法从PublishSubject获得Observable(或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; 
     } 
    } 
} 

如果你不想两种方法,你可以在你随处移动运营商.filter()的Rx链,你可能最终的东西像这样:

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(); 
+0

我想除了第一个解决方案之外,还没有很好的方法可以做到这一点。感谢您的更新。 – riteshakya037