将T的序列转换为无限流内的List <t>

时间:2017-01-24 20:17:57

标签: android rx-java rx-android rx-binding

我使用RxBinding来处理我的应用中的搜索。如何将结果作为项目列表? toList().toBlocking().single()不是无限流中的选项,因为永远不会调用onComplete()。有任何想法吗?感谢。

RxSearchView.queryTextChanges(searchView)
                    .filter(queryString -> queryString.length() > 3 || queryString.length() == 0)
                    .debounce(500, TimeUnit.MILLISECONDS)
                    .map(CharSequence::toString)
                    .flatMap(s -> Observable.from(fishPlaces)
                                            .filter(fishPlace -> fishPlace.getName().toLowerCase().contains(s.toLowerCase())))
                    .subscribe(fishPlace -> { **// HOW TO GET A LIST<FISHPLACE> HERE???** }, throwable -> {});

2 个答案:

答案 0 :(得分:1)

虽然可以阻止平面图中的可观察对象。所以你可以只用map()代替flatmap()并在fishplaces的observable上做toList()。

.map(s - &gt; Observable.from(fishPlaces).filter(fP-&gt; foo(s,fP))。toList()))

答案 1 :(得分:1)

我猜您所追求的是与特定搜索字符串匹配的“fishPlaces”列表。

我还猜测“fishPlaces”的数量是有限的,因为否则列出它是没有意义的。

稍作修改(没有实际运行代码),我想以下内容可行:

RxSearchView.queryTextChanges(searchView)
                    .filter(queryString -> queryString.length() > 3 || queryString.length() == 0)
                    .debounce(500, TimeUnit.MILLISECONDS)
                    .map(CharSequence::toString)
                    .map(s -> Observable.from(fishPlaces)
                                        .filter(fishPlace -> fishPlace.getName().toLowerCase().contains(s.toLowerCase()))
                                        .toList().toBlocking().single())
                    .subscribe(fishPlaces -> { /* Go fishing! */ }, throwable -> {});