Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个可观察到的事件引发一定数量的事件后触发一个动作_Java_Android_Rx Java_Observable_Rx Android - Fatal编程技术网

Java 在一个可观察到的事件引发一定数量的事件后触发一个动作

Java 在一个可观察到的事件引发一定数量的事件后触发一个动作,java,android,rx-java,observable,rx-android,Java,Android,Rx Java,Observable,Rx Android,我对RxJava很陌生,在自定义流方面有问题。这里的用例是: 我有一个RecyclerView和一个GridLayoutManager显示图像网格,还有一个页脚和一个TextView显示图像总量。把它放到一个上下文中,我作为一个用户总共可以有15个图像,由TextView反映出来,它会说“15个图像”,但网格仍然只显示4个(理解为“预览”)。现在,为了显示这些图像,在我创建的可观察对象的onComplete()中,我将调用adapter.notifyDatasetChanged()。但是,如果

我对RxJava很陌生,在自定义流方面有问题。这里的用例是:

我有一个
RecyclerView
和一个
GridLayoutManager
显示图像网格,还有一个页脚和一个
TextView
显示图像总量。把它放到一个上下文中,我作为一个用户总共可以有15个图像,由
TextView
反映出来,它会说“15个图像”,但网格仍然只显示4个(理解为“预览”)。现在,为了显示这些图像,在我创建的可观察对象的
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个图像


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

如果在
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();
                                });

谢谢你的回答。我需要修改我的问题-问题是我需要进一步处理的图像列表,超出了这个问题的范围。页脚文本是我需要完整列表的一个例子,尽管我认为这是一个很弱的例子。实际上,我仍然需要完整的图像列表。您是否需要对整个列表执行操作,例如获取其大小或将列表传递给适配器,或者您是否需要发出这200个图像?在第一种情况下,您可以只修改代码块,在这里您仍然可以访问您的列表(在第一条注释下面)。在第二种情况下,我将更新我的答案OK,使其看起来像这样。我有一个显示用户配置文件的屏幕。基于
userId
,我将获得用户的图像列表。然而,不是为了填充用户配置文件中的所有内容,我只想显示其中的4个,页脚显示一个文本,指示用户总共有多少个图像。页脚是可点击的,这将打开一个新屏幕,显示所有图像的列表。这就是为什么我需要完整的图像列表,将其传递到新屏幕,新屏幕将显示它,但在“主屏幕”中仅显示其中4个。它能更好地解释这种情况吗?我认为这个答案中的代码是正确的@Austie,如果你想多次订阅一个呼叫,你需要一个
ConnectableObservable
。看,这不会解决我的问题。通过在平面图之后调用
take(4)
,第四幅图像发出后,可观察对象将完成。在具有200个图像的示例中,我希望从发出的200个图像中获得4个图像,通知适配器,并在其完成发出200个图像后完成observable,然后将其添加到列表中。