LiveData 和转换使用

LiveData and Transformation usage

我有一个 Android 应用程序 类:

当用户单击 ListActivity 项目时,

ListActivity 使用意图的额外参数传递给 DetailActivity itemId

流程应该是:

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

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

我怎样才能得到它?我想有一个 Transformation 要做,但我不明白如何实现它。

您应该在 Activity 中观察您的 LiveData<Item> 后执行该过程。

Transformations.map 函数是实现此目的的最佳选择。

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

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

Transformations.map 将获取给定 LiveData<T> 发出的值并映射 return 一个 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()
    }
}