Android 基于多个实时数据值的逻辑
Android Logic Based On Multiple Live Data Values
我正在使用 Android 数据绑定库通过 LiveData 创建反应视图
我为工作列表发出回购请求
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() }
如果请求未完成且作业列表为空,我想在布局中显示一个加载微调器,并且我的视图模型中需要一个变量来指示它
我已经尝试了下面的代码,正如预期的那样,它不起作用
val spinnerVisible: LiveData<Boolean>
= Transformations.map(requestComplete) {
!(requestComplete.value ?: false) && (jobsEmpty.value ?: true)
}
拥有基于其他 2 个状态的 LiveData 变量的正确做法是什么 - 我想将所有逻辑保留在视图模型中,而不是 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
请注意,您需要 return mediatorlivedata 作为结果,因为这是您对布局感兴趣的对象。
此外,您可以查看 MediatorLiveData
上的文档,其中有更多示例:https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData
我正在使用 Android 数据绑定库通过 LiveData 创建反应视图
我为工作列表发出回购请求
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() }
如果请求未完成且作业列表为空,我想在布局中显示一个加载微调器,并且我的视图模型中需要一个变量来指示它
我已经尝试了下面的代码,正如预期的那样,它不起作用
val spinnerVisible: LiveData<Boolean>
= Transformations.map(requestComplete) {
!(requestComplete.value ?: false) && (jobsEmpty.value ?: true)
}
拥有基于其他 2 个状态的 LiveData 变量的正确做法是什么 - 我想将所有逻辑保留在视图模型中,而不是 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
请注意,您需要 return mediatorlivedata 作为结果,因为这是您对布局感兴趣的对象。
此外,您可以查看 MediatorLiveData
上的文档,其中有更多示例:https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData