首页 > 解决方案 > LiveData 和转换使用

问题描述

我有一个带有这些类的 Android 应用程序:

ListActivity当用户单击项目时,传递给DetailActivity使用意图的额外参数。itemIdListActivity

流程应该是:

  1. DetailActivity实例化DetailViewModel传递itemId
  2. DetailViewModel从提供RepositoryLiveData<Item>对象中获取itemId
  3. DetailViewModelList<NameValueBean>使用LiveData<Item>字段 ( propertiesList.add(new NameValueBean("field1", item.getField1()); ...)创建一个
  4. DetailActivity观察List<NameValueBean>并用它来喂它DetailAdapter是细节的控制器ListView

问题是List<NameValueBean>应该是可观察的,所以应该是 a LiveData<List<NameValueBean>>,每次LiveData<Item>更改时创建。

我怎么能得到那个?我认为有一个转换要做,但我不明白如何实现它。

标签: androidandroid-architecture-componentsandroid-livedataandroid-viewmodel

解决方案


Transformations.map功能是完成此任务的最佳选择。

为了提供更多上下文,Transformations.map将采用 a LiveData<T>,执行转换并将其变成 a LiveData<Y>

该方法采用, 和 lambda ,其目的是将,LiveData<T>发出的值转换为新值。LiveDataTY

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()
    }
}

推荐阅读