![](/img/trans.png)
[英]How to fill spinner with data from Room without blocking UI thread
[英]How to fill spinner with data from room, with MVVM architecture
我想知道用房间数据库中的数据填充任何 Spinner 的最佳实践/方法。
我还想使用 ViewModel 和 LiveData(然后我将转到 StateFlow,)。 但我对正确的顺序定义变量感到困惑。
首先我在 model 视图中有这个:
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
,我建议您使用private lateinit var
,就像您提到的那样。 当您一开始正确初始化spinnerAnio
的适配器时,它不会追溯识别您在执行生命周期钩子后对aniosAdapter
的任何突变。 相反,您将需要调整aniosLiveData
观察者以显示如下:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner, {
binding.spinnerAnio.adapter = ArrayAdapter<Anio>(
requireContext(),
R.layout.spinner_text_item,
it
)
})
在您确实需要在生命周期钩子的aniosAdapter
之外引用 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.