【问题标题】:Android - LiveData doesn't get updatedAndroid - LiveData 未更新
【发布时间】:2019-08-30 19:57:25
【问题描述】:

在我的片段中,我观察到 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 但没有任何效果。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      试试这个:

      dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)
      

       dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
      

      【讨论】:

      • 我无法尝试您的那些,因为 .getDbQUestionsForCategory 返回实时数据,但我确实尝试过:dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter).value 它不起作用,与 postValue 相同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多