繁体   English   中英

LiveData观察者改变而不是保持不变的问题

[英]Problem with LiveData observer changing rather than staying the same

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

显然问题在于我创建适配器的方式,因为观察者每次都在变化。 或者我是这么理解的。 该观察者被困在 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 } )

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

您应该在adapter中有一个internal function 用于设置值并通知适配器。 而且,不要在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)

} )

希望你很清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM