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