项目背景 : 某个int值,在A页面需要获取它的显示int数值,在B页面需要需要将int值转换为String字符串
1. Transformations.map
基于此背景,此文介绍下Transformations.map和Transformations.switchMap,数据源A监听数据源B的内容,变化时将B
的内容转化为相应的其他内容并且通知给A数据源的观察者。
案例
class CarViewModel : ViewModel() {
// 数据源 B
private var initialData = MutableLiveData<Int>()
/**
* @describe 数据源A
*/
private var transformLiveData = Transformations.map(getInitialData()) {
when (it) {
0 -> "on"
else -> "off"
}
}
fun getInitialData(): MutableLiveData<Int> {
return initialData
}
}
2.Transformations.switchMap
数据源A监听数据源B的内容的变化, 变化时从B内容获取相应的数据源C, 添加到A的监听列表
即 A 同时监听B和C ,B内容的变化只会(switch)更换A监听列表里的C,C内容的变化才会通知A监听器
class CarViewModel : ViewModel() {
// 数据源B
private val userLivedata = MutableLiveData<User>()
// 数据源C1
private val cFirstLiveData = MutableLiveData<Int>()
// 数据源C2
private val cSecondLiveData = MutableLiveData<Int>()
/**
* 数据源A
*/
val mapLiveData = Transformations.switchMap(userLivedata) {
when (it.name) {
"test" -> cFirstLiveData
else -> cSecondLiveData
}
}
data class User(val name: String = "test", var age: Int = 18)
}
3.MediatorLiveData
合并两个LiveData
var count = 0
// A 数据
private val liveData1 = MutableLiveData<String>()
// B 数据
private val liveData2 = MutableLiveData<Int>()
val liveCombind = MediatorLiveData<String>()
init {
liveCombind.addSource(liveData1) {
addData()
}
liveCombind.addSource(liveData2) {
addData()
}
}
private fun addData() {
count++
if (count == 10) {
count = 0
//TODO
}
}