首页 > 解决方案 > 如何使用 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>

这是正确的方法吗?还有另一种 ??更简单?

提前致谢!此致

标签: androidkotlinspinner

解决方案


如果您需要参考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

推荐阅读