当前位置: 首页 > 知识库问答 >
问题:

Android-LiveData不会更新

慎俊雄
2023-03-14

在我的片段中,我观察到db问卷列表字段:

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)
    }

Dao方法:

@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") 
       }

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

共有2个答案

宇文俊明
2023-03-14

试试这个:

dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)

 dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
蔺翰音
2023-03-14

您没有得到更新的原因是onFilterChanged()正在重新分配dbQuestionsList,而不是更新它。所以你最初观察到的变量实际上从未被修改过。

我可能会使用转换来实现这个:

val filter = MutableLiveData<String>().apply { value = "" }
val dbQuestionsList = Transformations.switchMap(filter) {
    mRepository.getDbQuestionsForCategory(filter)
}

然后在您的片段中,当单击按钮时,只需设置过滤器

viewModel.filter.value = button.tag as String
 类似资料:
  • 我目前正在重构遗留代码,以使用Android架构组件,并在一种存储库模式中设置一个房间数据库和截取请求。因此,表示层/域层要求存储库获取LiveData对象进行观察,或告诉他与服务器同步,然后删除旧的db条目,并从服务器中重新提取所有当前条目。 我已经写了同步部分的测试,所以我确信,对象被正确地获取并插入到数据库中。但是当写一个测试来观察db表的条目时(并测试对象是否被正确保存,以及在将它们放入d

  • UserViewModel: 用户存储库:

  • 活动不是问题的一部分。它只是初始化导航图和它的生命周期方法在pause,ondestroy...你可以从视频中推断出(显然,onCreate和onResume被称为点击“smistamento A giro”的瞬间) 在本演示中使用了两个片段,SmistamentoGiroTabFragment(它将子片段作为选项卡,但对于本问题的目的并不重要)和SmistaMentogiroCercagiroF

  • 嗨,我有一个项目的列表,我从数据源中检索,然后我在可观察的地图上应用,将数据存储到ROOM。 它设法将它添加到表中,但当我试图检索它的LiveData时,它似乎没有通知我的观察者结果。 有明确的数据在表中,我的查询工作,因为我改变了返回时间从LiveData到简单的列表,这工作得很好 这是我的数据类 这是我的DAO,它公开了一个func,可以添加所有项目列表 我的DB类 以下是我如何将数据插入数据

  • 假设的例子 假设如下... 我的LiveData类如下所示: 同样,这不是真的很低效吗,因为它会在recyclerView.adapter中触发完全刷新吗?

  • 我正在从可组合对象调用增量计数(id: String)方法以增加LiveData对象列表中参数的值。该值更新得很好,但UI仅在我导航出去后显示更新。PS:我正在使用BottomNaviation视图进行导航。 问题中的可组合屏幕看起来像这样 事物的 ViewModel 方面如下所示: decreaseItemCount函数类似于increaseItemCount,唯一的区别是计数在减少。