【问题标题】:Problem with LiveData observer changing rather than staying the sameLiveData观察者改变而不是保持不变的问题
【发布时间】:2021-02-05 01:52:42
【问题描述】:

我对链接到 LiveData 的 RecyclerView 有疑问。每次有更新时,RecyclerView 内容都会一直备份到顶部。

显然问题出在我创建适配器的方式上,因为 Observer 每次都在变化。或者我是这么理解的。那个观察者被困在一个 lambda 中,这是我仍然非常熟悉的许多事情之一。

这显然是问题所在:

languagesViewModel.getLanguagesForUser().observe ( viewLifecycleOwner, { languages ->
        LANGUAGES_SCREEN_VIEWS.languagesRecyclerView.adapter = LanguagesRecyclerViewAdapter ( languages ) } )

我试图从中得到一些东西,但它没有用......

我的第一次尝试是这样的:

var languageAdapter = LANGUAGES_SCREEN_VIEWS.languagesRecyclerView.adapter

languagesViewModel.getLanguagesForUser().observe( requireActivity(), { languages ->
            languageAdapter = LanguagesRecyclerViewAdapter(languages) } )

有一个警告,变量已分配但从未访问过,语言列表为空。

我的第二次尝试是这样的:

    val languages = mutableListOf < LanguagesEntity > ()
    var languagesAdapter = LanguagesRecyclerViewAdapter(languages)

    languagesViewModel.getLanguagesForUser().observe( requireActivity(), { languages ->
        LANGUAGES_SCREEN_VIEWS.languagesRecyclerView.adapter = languagesAdapter } )

我希望很清楚,不幸的是我不知道我应该做什么。不是因为缺乏尝试,因为我在寻求帮助之前在黑暗中刺了三天,显然这就是问题所在的代码部分。如果我也找到解决方案,我会尝试回答我自己未回答的问题。这次不会发生了。

【问题讨论】:

  • 您可能想查看stackoverflow.com/help/how-to-ask 您在“非常感谢您提前”之前的最后声明。很差。
  • 注意到 :-) 它确实来自凌晨 2 点的挫败感,以及之前在相关问题上的奇怪互动。

标签: android kotlin android-livedata mutablelivedata


【解决方案1】:

您应该在adapter 中有一个internal 函数用于设置值并通知适配器。 另外,不要在LiveData observer 中设置您的适配器

您应该考虑这种架构。

适配器

// STEP 1 - make a function to notify the variable
internal fun setLanguage(lang: List<LanguagesEntity>) {
       languages = lang
       notifyDataSetChanged()
 }
// STEP 2 - setup recyclerview before everything
val languages = mutableListOf < LanguagesEntity > ()
var languagesAdapter = LanguagesRecyclerViewAdapter(languages)
LANGUAGES_SCREEN_VIEWS.languagesRecyclerView.adapter = languagesAdapter 


// STEP 3 - set new value to adapter
languagesViewModel.getLanguagesForUser().observe( requireActivity(), { languages ->
    
    languagesAdapter.setLanguage(language)

} )

希望你清楚。

【讨论】:

  • 我真的看不出这里有什么不同
  • 你的意思是你只想要 1 个镜头值?
  • notifyDataSetChanged() 太昂贵了,因为您可以只更改小部分。
  • 实际上,正如预期的那样,您将适配器初始化从观察者中取出做得很好!
  • @Dan 如果你想从LiveData 获得 1 次的返回值,你可以考虑 kotlin Flow developer.android.com/kotlin/flow
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多