android - LiveData 和转换使用
问题描述
我有一个带有这些类的 Android 应用程序:
ListActivity
显示所有Item
对象ListView
DetailActivity
应该显示一个对象的所有属性,使用另一个ListView
Item
是我的对象,其中包含field1
,field2
, 等等
ListActivity
当用户单击项目时,传递给DetailActivity
使用意图的额外参数。itemId
ListActivity
流程应该是:
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>
应该是可观察的,所以应该是 a LiveData<List<NameValueBean>>
,每次LiveData<Item>
更改时创建。
我怎么能得到那个?我认为有一个转换要做,但我不明白如何实现它。
解决方案
该Transformations.map
功能是完成此任务的最佳选择。
为了提供更多上下文,Transformations.map
将采用 a LiveData<T>
,执行转换并将其变成 a LiveData<Y>
。
该方法采用, 和 lambda ,其目的是将,LiveData<T>
发出的值转换为新值。LiveData
T
Y
Transformations.map
将采用给定LiveData<T>
和映射发出的值并返回 a 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()
}
}
推荐阅读
- jmeter - 如何在 Blaze 仪表报告中查找总用户数?它显示最大用户数但未显示总用户数
- php - 如何准确减去两个浮点值
- javascript - 场景中的神器three.js/editor
- reactjs - 在反应应用程序中访问令牌过期后自动注销
- sql - 标记 SQL Oracle 开发人员最佳实践
- laravel - 无法在 Laravel 中广播通知
- amazon-web-services - 如何使用带有 curl 命令的 kubectl 在 Couchbase 中创建存储桶并将数据插入其中。?
- android-studio - 我可以像这张照片那样运行我的模拟器手册吗?
- java - 在 Glasspane 前面显示 InternalFrame
- node.js - 对 node.js 进行更改后,LocalHost 未加载我在 Windows 的 linux 子系统上运行命令