【发布时间】:2020-05-22 22:25:46
【问题描述】:
假设我有一个包含以下项目的微调器:“A”、“B”、“C”。如果用户尚未选择任何内容,则微调器会显示“未知”。
第一步,用户可能在过去选择了一个项目。所以我在视图模型中加载数据,hasSelectedSomething 观察到视图模型中的LiveData(对 BE 的异步调用,将更新LiveData):
viewModel.itemLiveData.observe(
viewLifecycleOwner,
Observer { item ->
hasSelectedSomething = (item != "unknown")
}
)
第二步我现在设置我的微调器。如果用户尚未选择任何内容,我希望在“未知”项目中选择微调器,否则我希望在用户之前选择的任何地方选择它。
if(!hasSelectedSomething) {
spinner.setSelection(itemAdapter.getPosition("unknown"))
} else {
spinner.setSelection(itemAdapter.getPosition(viewModel.getItemString()))
}
第三步我实现了spinner.onItemSelectedListener:
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
val selectedItem = spinner.getItemAtPosition(pos) as String
viewModel.updateItemWithSelection(selectedItem)
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
我的问题是LiveData 的默认值是“未知”,这意味着微调器从“未知”开始,这是有意的。然后假设用户过去选择了“B”,所以我以编程方式将微调器设置为“B”。问题是.setSelection 触发onItemSelected 将选择设置为pos 是什么,当时pos 对应于“未知”。所以发生的事情是LiveData 从“未知”(默认值)变为“B”(调用 BE 的结果)到“未知”(onItemSelected 选择了“未知”,因此它再次将该值传递给视图模型)。
我该如何解决这个问题?如何正确设置微调器以使其处理默认值、用户选择和先前的选择?
【问题讨论】: