在观察者发出一定数量的物品后触发动作

时间:2017-10-30 12:18:39

标签: java android rx-java observable rx-android

我对RxJava很陌生并且在定制流程时遇到问题。这里的用例是:

The View

我的RecyclerView GridLayoutManager显示图片网格,页脚TextView显示图片总数。为了把它放到一个上下文中,我作为一个用户可以有总共15个图像,由TextView反映,它会说“15个图像”,但网格仍然只显示4个(将其理解为“预览” “)。现在,为了显示这些图像,在我创建的Observable的onComplete()中,我将调用adapter.notifyDatasetChanged()。然而,等待这些图像出现是没有意义的,如果列表由200个图像组成。我想在列表中发出4张图像后立即通知适配器。我的观察是以这种方式创建的:

Observable.just(user.getUserId())
            .subscribeOn(Schedulers.io())
            .map(this::getImageList)
            .flatMap(images -> Observable.fromIterable(images)
                .map(image -> image))
            .observeOn(AndroidSchedulers.mainThread());

这样做之后,我无法通知Observer.onNext()中的适配器,因为如果images.size == 200那么它会被通知200次(希望我在这里是正确的)。我无法在Observer.onComplete()中执行此操作,因为它会等待所有200个示例性图像在适配器得到通知之前发出。如何拦截该流程,在发出列表中的4个项目时执行操作(通知适配器),但继续发出其余部分,这样我就可以显示具有总图像数量的正确页脚文本,而不会仅完成4个项目图象?

UPDATE - 出于本问题范围之外的目的,我需要在observable完成后的完整图像列表。我想显示其中的4个,用检索到的图像总数更新TextView并存储检索到的总图像列表。

1 个答案:

答案 0 :(得分:2)

如果您修改了flatMap中的代码,您仍然可以访问图片列表并获取其大小。

Observable.just(user.getUserId())
        .subscribeOn(Schedulers.io())
        .map(this::getImageList)
        .flatMap(images -> {
               // you can access images size here, update footer
               footer.setText(images.size() + " images");
               // pass full list of images to your view, i.e like this
               view.setImages(images);
               return Observable.fromIterable(images)
            })
            .take(4)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(image -> { 
                                // add image to grid 
                                },
                       error -> { 
                                // handle error
                                }
                       () ->    {
                                // four images were emitted, emission complete
                                adapter.notifyDatasetChanged();
                                });