我有一个包含这些类的 Android 应用:
ListActivity
显示所有Item
ListView
中的对象DetailActivity
应该显示对象的所有属性,使用另一个ListView
Item
是我的对象,它包含field1
,field2
等等
ListActivity
传递给 DetailActivity
itemId
当用户点击 ListActivity
时使用 Intent 的额外参数项目。
流程应该是:
-
DetailActivity
实例化DetailViewModel
通过itemId
-
DetailViewModel
从Repository
获取LiveData<Item>
由提供的itemId
标识的对象 -
DetailViewModel
创建一个List<NameValueBean>
使用LiveData<Item>
字段 (propertiesList.add(new NameValueBean("field1", item.getField1()); ...
) -
DetailActivity
观察List<NameValueBean>
并用它来喂养DetailAdapter
这是细节的控制者ListView
问题是 List<NameValueBean>
应该是可观察的,所以应该是 LiveData<List<NameValueBean>>
, 每次创建 LiveData<Item>
变化。
我怎样才能得到它?我认为有一个转换要做,但我不明白如何实现它。
最佳答案
Transformations.map
函数是实现此目的的最佳选择。
为了提供更多背景信息,Transformations.map
将采取 LiveData<T>
, 执行转换并将其变成 LiveData<Y>
.
该方法需要一个 LiveData<T>
, 而一个 lambda 的目的是转换 LiveData
发出的值, T
, 变成一个新的值 Y
.
Transformations.map
将采用给定 LiveData<T>
发出的值映射并返回 LiveData<Y>
.
注意:这个转换将在主线程上完成。
来源:https://developer.android.com/reference/android/arch/lifecycle/Transformations#map
快速回答:
fun getNameValueBeanLiveData(itemId: Int): LiveData<List<NameValueBean> {
val itemLiveData: LiveData<Item> = repository.getItemLiveData(itemId)
return Transformations.map(itemLiveData) { item ->
val nameValueBeanList = mutableListOf<NameValueBean>()
return nameValueBeanList.apply {
add("field1", item.field1)
add("field2", item.field2)
...
}.toList()
}
}
关于android - LiveData 和转换使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449775/