1

在我的片段中,我观察到 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,但没有任何原因会更新。数据库不为空,因此没有理由返回 null 并且不触发主片段中的观察者。但是当我在我的 viewModel 中这样做时:

lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
       init{
        onFilterChanged("travel") 
       }

在我硬编码参数的地方,房间将返回列表并且片段中的观察者将被触发,所以它就像那样工作,但是当按下按钮时传递参数时不起作用,请解释一下,因为这件事没有意义。我尝试使用可变的实时数据,使用 .setValue 和 .postValue 但没有任何效果。

4

2 回答 2

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
于 2019-08-30T20:40:53.583 回答
-1

试试这个:

dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)

或者

 dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
于 2019-08-30T20:05:34.687 回答