Android-LiveData不会更新

时间:2019-08-30 19:57:25

标签: android android-architecture-components android-livedata mutablelivedata

在我的片段中,我观察到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处理可变的实时数据,但是没什么用。

2 个答案:

答案 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))