LiveData和转换用法

时间:2018-11-23 16:02:26

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

我有一个带有以下类的Android应用:

  • ListActivityItem

  • 中显示所有ListView个对象
  • DetailActivity应该使用另一个ListView

  • 显示对象的所有属性
  • Item是我的对象,其中包含field1field2

ListActivity在用户单击DetailActivity项目时使用意图的多余参数传递给itemId ListActivity

流应为:

  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>更改时创建的numberL :: [String] -> [String] numberL [] = [] numberL (x:xs) = ([show (length(x:xs)) ++ ": " ++ x] ++ numberL (xs))

我该怎么办?我认为有一个转换可以执行,但是我不知道该如何实现。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您应该在观察“活动”中的LiveData<Item>之后执行该过程。