LiveData 观察者发生变化而不是保持不变的问题
Problem with LiveData observer changing rather than staying the same
我对链接到 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 } )
我希望很清楚,不幸的是我不知道我真正应该做什么。不是因为缺乏尝试,因为我在寻求帮助之前在黑暗中刺了三天,显然那是代码的问题所在。如果我也找到解决方案,我会尝试回答我自己未解决的问题。这一次不会发生了。
你应该在 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)
} )
希望你清楚。
我对链接到 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 } )
我希望很清楚,不幸的是我不知道我真正应该做什么。不是因为缺乏尝试,因为我在寻求帮助之前在黑暗中刺了三天,显然那是代码的问题所在。如果我也找到解决方案,我会尝试回答我自己未解决的问题。这一次不会发生了。
你应该在 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)
} )
希望你清楚。