观察另一个ViewModel的ViewModel

时间:2019-02-21 19:24:02

标签: android kotlin android-livedata

我有一个返回此内容的DAO:

 @Query(value = "SELECT * FROM users")
 fun getUsers(): LiveData<List<User>>

我需要观察一下并将User对象转换为People对象。 People没有实现或扩展User,但是我有一个可以转换它们的方法。这是我无法更改的要求。

 fun convert(user: User): Person {...}

这就是我试图观察数据的方式。

class UserViewModel : ViewModel {
    private lateinit var people: MutableLive<List<People>>

    init {
        db.getUsers().observe(this, Observer { userList ->
            if(userList != null)
               // here I need to do some sort of transformation.
        }
    }

    // what activity will observer
    fun getPeople() : MutableLive<List<People>> {
       return people
    }
}

因此,如果Activity可以观察到people: MutableLive<List<People>>并且不知道这种转变正在发生,我会喜欢的。

请帮助。

1 个答案:

答案 0 :(得分:1)

这是Transformations.map的工作,在您的示例中,您可以用来执行以下操作:

class UserViewModel : ViewModel() {
    private lateinit var people: LiveData<List<Person>>

    init {
        people = Transformations.map(db.getUsers()) { users ->
            users.map { user -> convert(user) }
        }
    }
}

这为您提供了一个LiveData,它是由原始来源提供的,但是将给定的映射功能应用于它发出的数据,并且生命周期意识也得到了适当的维护。