android - LiveData观察者改变而不是保持不变的问题
问题描述
我对链接到 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 } )
我希望很清楚,不幸的是我不知道我应该做什么。不是因为缺乏尝试,因为我在寻求帮助之前在黑暗中刺了三天,显然这就是问题所在的代码部分。如果我也找到解决方案,我会尝试回答我自己未回答的问题。这一次它不会发生。
解决方案
您应该具有设置值并通知适配器的internal
功能。adapter
而且,不要将您的适配器设置为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)
} )
希望你很清楚。
推荐阅读
- python - 在 Python 中堆叠和计算矩形
- java - 为什么单击按钮时我的页面不存在?
- php - Laravel 5.8 Field 'name 没有默认值
- visual-studio-code - 带有 VS Code 的 F#:重定向用户输入
- android - 为什么我尝试将文件替换为另一个文件后,我的图像文件名是红色的?
- listview - Flutter:将项目添加到列表并滚动到结束后,Listview 获得完整大小的滚动控制器
- python - 使用-1为未知行重塑python数组并用None填充剩余空格
- reactjs - React + Redux - 状态更改后组件不更新
- java - “Public static final”安全漏洞的解决方案
- flutter - flutter - 需要扩展 State 和 FormField