android - 如何使用 MVVM 架构用房间中的数据填充微调器
问题描述
我想知道用房间数据库中的数据填充任何 Spinner 的最佳实践/方法。
我还想使用 ViewModel 和 LiveData(然后我将转到 StateFlow!),但我对定义变量的正确顺序感到困惑。
首先我在视图模型中有这个:
val aniosLiveData = anioRepository.anios.asLiveData() // return LiveData<List<Anio>>
然后在片段上,首先是视图模型声明:
private val ensayosViewModel: EnsayosViewModel by viewModels()
然后,在 onViewCreated() 我有一个带有绑定元素的块:
binding.apply {
recyclerViewEnsayos.apply {
adapter = ensayosAdapter
layoutManager = LinearLayoutManager( requireContext())
setHasFixedSize(true)
}
spinnerAnio.apply {
adapter = aniosAdapter // <- Spinner adapter
}
}
我重写 onCreate() 来定义一个观察者,然后我把这些行:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner, {spinnerData ->
aniosAdapter = ArrayAdapter<Anio>(requireContext(), R.layout.spinner_text_item, spinnerData)
})
我需要在哪里/何时声明“aniosAdapter”?像这样: ?
//At class level
private lateinit var aniosAdapter : ArrayAdapter<Anio>
这是正确的方法吗?还有另一种 ??更简单?
提前致谢!此致
解决方案
如果您需要参考aniosAdapter
生命周期钩子的外部,我建议您使用 aprivate lateinit var
您提到的。当您spinnerAnio
一开始正确初始化 's 适配器时,它不会追溯识别您aniosAdapter
在执行生命周期挂钩后所做的任何突变。相反,您将需要调整aniosLiveData
观察者以使其显示为:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner, {
binding.spinnerAnio.adapter = ArrayAdapter<Anio>(
requireContext(),
R.layout.spinner_text_item,
it
)
})
在您确实需要引用aniosAdapter
生命周期钩子范围之外的场景中,您的观察者可能会与private lateinit var
您引用的内容一起看起来像这样:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner, {
aniosAdapter = ArrayAdapter(
requireContext(),
R.layout.spinner_text_item,
it
)
binding.spinnerAnio.adapter = aniosAdapter
})
如果您可以保证您的观察者会立即触发,aniosAdapter
那么将其声明为private lateinit var
. 如果您不确定,将其视为可选字段会更安全,如下所示。干得好!
private var aniosAdapter: ArrayAdapter<Anio>? = null
推荐阅读
- html - 自动重新定位溢出内容的 CSS 列
- python - 正则表达式查找所有字符串和介于两者之间的任何字符的链接
- python - Django多对多关系不返回集合对象
- javascript - Event.target 检查发生得太快
- amazon-web-services - AWS SSM 修补本地服务器?
- python - Pynamodb - 动态 JSON 序列化
- php - 将 PHP 字符串读取为整数
- c# - 如何在 Linux/MacOS 上正确发送 MultipartContent?
- twitter - Twitter API / 关注某人
- apache-spark - 异常:原因:org.datanucleus.exceptions.NucleusUserException:持久化进程