Android - LiveData 没有得到更新
Android - LiveData doesn't get updated
在我的片段中,我观察到 dbQuestionsList 字段:
viewModel.dbQuestionsList.observe(viewLifecycleOwner, Observer { list ->
Log.i("a", "dbQuestionsList inside fragment = $list ")
})
在我的片段中,我有几个按钮,根据按下哪个按钮,我在 viewModel 上调用方法,将设置为标签的字符串传递给按钮。
viewModel.onFilterChanged(button.tag as String)
我的视图模式:
lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
init{
onFilterChanged("")
}
private fun onFilterChanged(filter: String) {
dbQuestionsList = mRepository.getDbQuestionsForCategory(filter)
}
存储库方法:
fun getDbQuestionsForCategory(categoryName: String): LiveData<List<DatabaseQuestion>> {
return database.dbQuestionsDao().getDbQuestionsByCategory(categoryName)
}
道法:
@Query("SELECT * FROM db_questions_database WHERE category = :categoryId")
fun getDbQuestionsByCategory(categoryId: String): LiveData<List<DatabaseQuestion>>
当我按下按钮时,会调用 viewModel 方法,其参数应该用于通过搜索房间数据库来更新 LiveData,但没有任何原因得到更新。数据库不为空,因此没有理由 return null 并且不触发主片段中的观察者。
但是当我在我的 viewModel 中这样做时:
lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
init{
onFilterChanged("travel")
}
我硬编码参数的地方,房间将 return 列表和片段中的观察者将被触发,所以它像那样工作但在按下按钮时传递参数时不起作用,请解释因为这个事情没有意义。我尝试使用可变的实时数据,使用 .setValue 和 .postValue 但没有任何效果。
试试这个:
dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)
或
dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
您没有收到更新的原因是 onFilterChanged()
正在重新分配 dbQuestionsList
,而不是更新它。所以你最初观察到的变量实际上从未被修改过。
我可能会使用 Transformation:
来实现它
val filter = MutableLiveData<String>().apply { value = "" }
val dbQuestionsList = Transformations.switchMap(filter) {
mRepository.getDbQuestionsForCategory(filter)
}
然后在您的片段中,只需在单击按钮时设置过滤器:
viewModel.filter.value = button.tag as String
在我的片段中,我观察到 dbQuestionsList 字段:
viewModel.dbQuestionsList.observe(viewLifecycleOwner, Observer { list ->
Log.i("a", "dbQuestionsList inside fragment = $list ")
})
在我的片段中,我有几个按钮,根据按下哪个按钮,我在 viewModel 上调用方法,将设置为标签的字符串传递给按钮。
viewModel.onFilterChanged(button.tag as String)
我的视图模式:
lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
init{
onFilterChanged("")
}
private fun onFilterChanged(filter: String) {
dbQuestionsList = mRepository.getDbQuestionsForCategory(filter)
}
存储库方法:
fun getDbQuestionsForCategory(categoryName: String): LiveData<List<DatabaseQuestion>> {
return database.dbQuestionsDao().getDbQuestionsByCategory(categoryName)
}
道法:
@Query("SELECT * FROM db_questions_database WHERE category = :categoryId")
fun getDbQuestionsByCategory(categoryId: String): LiveData<List<DatabaseQuestion>>
当我按下按钮时,会调用 viewModel 方法,其参数应该用于通过搜索房间数据库来更新 LiveData,但没有任何原因得到更新。数据库不为空,因此没有理由 return null 并且不触发主片段中的观察者。 但是当我在我的 viewModel 中这样做时:
lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
init{
onFilterChanged("travel")
}
我硬编码参数的地方,房间将 return 列表和片段中的观察者将被触发,所以它像那样工作但在按下按钮时传递参数时不起作用,请解释因为这个事情没有意义。我尝试使用可变的实时数据,使用 .setValue 和 .postValue 但没有任何效果。
试试这个:
dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)
或
dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
您没有收到更新的原因是 onFilterChanged()
正在重新分配 dbQuestionsList
,而不是更新它。所以你最初观察到的变量实际上从未被修改过。
我可能会使用 Transformation:
来实现它val filter = MutableLiveData<String>().apply { value = "" }
val dbQuestionsList = Transformations.switchMap(filter) {
mRepository.getDbQuestionsForCategory(filter)
}
然后在您的片段中,只需在单击按钮时设置过滤器:
viewModel.filter.value = button.tag as String