基于多个实时数据值的 Android 逻辑

标签 android mvvm kotlin android-databinding android-livedata

我正在使用 Android 数据绑定(bind)库通过 LiveData 制作响应式(Reactive) View

我提出一份工作 list 的 repo 请求

var jobsRequest: LiveData<Resource<List<Job>>>
    = Transformations.switchMap(position) { repo.getJobsWithStatus(it) }

然后我还有 3 个基于上述的 LiveData,就像这样

一、检查请求是否完成
private val requestComplete: LiveData<Boolean>
    = Transformations.map(jobsRequest) { 
        it.status == Status.SUCCESS || it.status == Status.ERROR 
      }

接下来,转换为没有资源包装器的作业列表
var jobs: LiveData<List<Job>>
    = Transformations.map(jobsRequest) { it.data }

最后,检查该作业列表是否为空
val jobsEmpty: LiveData<Boolean>
    = Transformations.map(jobs) { (it ?: emptyList()).isEmpty() }

在布局中,如果请求尚未完成并且作业列表为空并且需要我的 View 模型中的变量来指示这一点,我想在布局中显示加载微调器

我已经尝试了下面的代码,正如预期的那样,它不起作用
val spinnerVisible: LiveData<Boolean>
    = Transformations.map(requestComplete) {
        !(requestComplete.value ?: false) && (jobsEmpty.value ?: true)
      }

根据另外两个人的状态使用 LiveData 变量的正确做法是什么 - 我想将所有逻辑保留在 View 模型中,而不是在 Activity 或布局中。

最佳答案

jobsEmpty需要观察者吗?似乎您可以重复使用 jobs一个。

安韦,你的问题:
为此,有一个 MediatorLiveData .它可以满足您的需求:它可以合并多个(在您的情况下:2) LiveData 对象,并可以根据该对象确定另一个 livedata 值。

一些伪代码:

MediatorLiveData showSpinner = new MediatorLiveData<Boolean>()
showSpinner.addSource(jobsEmpty, { isEmpty ->
    if (isEmpty == true || requestComplete.value == true) {
       // We should show!
       showSpinner.value = true
    }
    // Remove observer again
    showSpinner.removeSource(jobsEmpty);
})
showSpinner.addSource(requestComplete, { isCompleted ->
    if (isCompleted == true && jobsEmpty == true) {
       // We should show!
       showSpinner.value = true
    }
    // Remove observer again
    showSpinner.removeSource(requestComplete);
})
return showSpinner

请注意,您需要返回 mediatorlivedata 作为结果,因为这是您对布局感兴趣的对象。

此外,您可以查看 MediatorLiveData 上的文档。 ,它还有更多示例:https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData

关于基于多个实时数据值的 Android 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010129/

相关文章:

android - Google Apps 中基于 Material Design 2 的自定义选择标签指示器

android - 用 Sax 解析这个页面

wpf - TreeViewItem.Expanded

c# - RaisePropertyChanged 的​​重要性是什么?

unit-testing - 如何在 MVVM 中使用消息框?

Java从字符串中间读取整数

java - 从 RecyclerView 的适配器设置 ImageView 颜色过滤器

spring - Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法

android - Kotlin Android Fragment recyclerView 和上下文问题

java - 通过从左到右填充来更改按钮背景