当用户进行查询或更改过滤器时,Room RxJava2 UI 更新为 Flowable<List<T>>
Room RxJava2 update UI with Flowable<List<T>> when user makes a query or changes the filter
当我插入或删除行时使用下面的过滤器 Flowable 更新。
val disposable = tasksRepository.getTasks(forceUpdate = false)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { listTask ->
Flowable.fromIterable(listTask)
.filter {
when (currentFiltering) {
TasksFilterType.ALL_TASKS -> true
TasksFilterType.ACTIVE_TASKS -> it.isActive
TasksFilterType.COMPLETED_TASKS -> it.isCompleted
}
}.toList().toFlowable()
}
.subscribe(
{
// onNext
nextValue: List<Task> ->
tasks.value = nextValue
},
{
// onError
error ->
tasks.value = emptyList()
}
)
但是,我想知道是否有可能仅通过更改过滤器或添加用户输入的查询字符串来获得另一个发射,或者我应该写一个 Single<List<Task>>
并在用户过滤或输入查询关键字时订阅它?
使用combineLatest()
。当任何源 observable 发出时,生成的 observable 发出。
示例:
private val currentFilter = BehaviorProcessor.createDefault<TasksFilterType>(TasksFilterType.ALL_TASKS)
private val userQuery = BehaviorProcessor.createDefault<String>("")
val disposable = Flowable
.combineLatest(getTasks(), currentFilter, userQuery) { listTask, filter, query ->
listTask
.filter { // filter tasks by filter
when (filter) {
TasksFilterType.ALL_TASKS -> true
TasksFilterType.ACTIVE_TASKS -> it.isActive
TasksFilterType.COMPLETED_TASKS -> it.isCompleted
}
}
.filter { task -> task.contains(query) } // filter tasks by query
}
.subscribeOn(...)
...
当我插入或删除行时使用下面的过滤器 Flowable 更新。
val disposable = tasksRepository.getTasks(forceUpdate = false)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { listTask ->
Flowable.fromIterable(listTask)
.filter {
when (currentFiltering) {
TasksFilterType.ALL_TASKS -> true
TasksFilterType.ACTIVE_TASKS -> it.isActive
TasksFilterType.COMPLETED_TASKS -> it.isCompleted
}
}.toList().toFlowable()
}
.subscribe(
{
// onNext
nextValue: List<Task> ->
tasks.value = nextValue
},
{
// onError
error ->
tasks.value = emptyList()
}
)
但是,我想知道是否有可能仅通过更改过滤器或添加用户输入的查询字符串来获得另一个发射,或者我应该写一个 Single<List<Task>>
并在用户过滤或输入查询关键字时订阅它?
使用combineLatest()
。当任何源 observable 发出时,生成的 observable 发出。
示例:
private val currentFilter = BehaviorProcessor.createDefault<TasksFilterType>(TasksFilterType.ALL_TASKS)
private val userQuery = BehaviorProcessor.createDefault<String>("")
val disposable = Flowable
.combineLatest(getTasks(), currentFilter, userQuery) { listTask, filter, query ->
listTask
.filter { // filter tasks by filter
when (filter) {
TasksFilterType.ALL_TASKS -> true
TasksFilterType.ACTIVE_TASKS -> it.isActive
TasksFilterType.COMPLETED_TASKS -> it.isCompleted
}
}
.filter { task -> task.contains(query) } // filter tasks by query
}
.subscribeOn(...)
...