【发布时间】:2019-11-28 12:56:47
【问题描述】:
我有以下用于搜索功能的 UI。
View (UI) << ViewModel() << LiveData(Remote)
(Search UI) (Search VM) Fetch data from remote
如上所述,View 观察 ViewModel 中的特定方法,该方法返回 LiveData,如下所示:
override fun onStart() {
super.onStart()
viewModel.finalLiveData.observe(viewLifecycleOwner, listChangeObserver)
}
// Observer responsible for updating the UI via adapter.
private val listChangeObserver: Observer<List<User>> = Observer { users ->
users?.let { updateUI(it) } ?: run { updateUI(emptyList()) }
}
override fun onStop() {
viewModel.finalLiveData.removeObserver(listChangeObserver)
super.onStop()
}
在 ViewModel 中,initSearch(searchKey:String) 过滤从远程接收到的 LiveData 并为 View 准备最后一个作为打击:
// Initiates the search with supplied search keys.
fun initSearch(searchInput: String?) {
// filtering happens in Deserializer() class
finalLiveData = Transformations.map(FirebaseQueryLiveData(query)) {
repository.getSearchList(it, searchInput, searchLocation)
}
}
并且initSearch 将从视图中调用为viewModel.initSearch(searchKey)。现在的问题是,finalLiveData 接收到来自转换的值,但不幸的是视图没有更新。
但是,请注意,如果用户尝试最近的应用并返回(通过调用 onPause() 和 onResume()),数据会反映在视图中
有没有更好的方法来更新观察到的LiveData?
提前致谢。
【问题讨论】:
标签: android android-lifecycle android-livedata android-architecture-components