android - LiveData 和转换使用

标签 android android-architecture-components android-livedata android-viewmodel

我有一个包含这些类的 Android 应用:

  • ListActivity显示所有 Item ListView 中的对象

  • DetailActivity应该显示对象的所有属性,使用另一个 ListView

  • Item是我的对象,它包含 field1 , field2等等

ListActivity传递给 DetailActivity itemId当用户点击 ListActivity 时使用 Intent 的额外参数项目。

流程应该是:

  1. DetailActivity实例化 DetailViewModel通过 itemId
  2. DetailViewModelRepository 获取LiveData<Item>由提供的 itemId 标识的对象
  3. DetailViewModel创建一个 List<NameValueBean>使用 LiveData<Item>字段 ( propertiesList.add(new NameValueBean("field1", item.getField1()); ... )
  4. 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/

相关文章:

android - 如何在 android 中为 HttpGet 请求添加 NameValuePairs

java - Android MotionLayout 在真实设备上不显示动画

android - onHandleIntent 中的代码是否会阻止 IntentService 接收其他 Intent ?

android - 分页库 - 一个具有多种 View 类型的回收器

android - 如何找出前一个 fragment 正在使用导航组件

java - 异步类不传递参数

Android ViewModel 设计/架构

android - Kotlin 中的泛型和 MutableLiveData

android - 如何使用 Kotlin 访问 LiveData<List<MVoice>> 的每个元素?

android - 在 fragment 和 Activity 之间更新 ViewModel