繁体   English   中英

如何使用 MVVM 架构用房间中的数据填充微调器

[英]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.

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