我对RxJava很陌生并且在定制流程时遇到问题。这里的用例是:
我的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
并存储检索到的总图像列表。
答案 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();
});