在我的片段中,我观察到dbQuestionsList字段:
viewModel.dbQuestionsList.observe(viewLifecycleOwner, Observer { list ->
Log.i("a", "dbQuestionsList inside fragment = $list ")
})
在我的片段中,我只有几个按钮,根据按下哪个按钮,我调用viewModel的方法,将设置为标签的字符串传递给按钮。
viewModel.onFilterChanged(button.tag as String)
我的ViewMode:
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)
}
Dao方法:
@Query("SELECT * FROM db_questions_database WHERE category = :categoryId")
fun getDbQuestionsByCategory(categoryId: String): LiveData<List<DatabaseQuestion>>
当我按下按钮时,viewModel方法将使用带有参数的参数进行调用,该参数应用于通过搜索房间数据库来更新LiveData,但是NOTHING会无故更新。数据库不是空的,因此没有理由返回null并且不触发主Fragment中的观察者。 但是当我在viewModel中这样做时:
lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
init{
onFilterChanged("travel")
}
我在其中对参数进行硬编码的地方,房间将返回列表,并且片段中的观察者将被触发,因此它可以像这样工作,但是当按下按钮时传递参数时不起作用,请解释,因为这没有意义。我尝试使用.setValue和.postValue处理可变的实时数据,但是没什么用。
答案 0 :(得分:1)
之所以没有得到更新,是因为onFilterChanged()
正在重新分配dbQuestionsList
,而不是对其进行更新。因此,您最初观察到的变量实际上从未被修改。
我可能会使用Transformation来实现这一点:
val filter = MutableLiveData<String>().apply { value = "" }
val dbQuestionsList = Transformations.switchMap(filter) {
mRepository.getDbQuestionsForCategory(filter)
}
然后在片段中,只需单击按钮即可设置过滤器:
viewModel.filter.value = button.tag as String
答案 1 :(得分:0)
尝试一下:
dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)
或
dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))