【问题标题】:Spinner: selecting item programatically with an on click listenerSpinner:使用 onclick 侦听器以编程方式选择项目
【发布时间】: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 选择了“未知”,因此它再次将该值传递给视图模型)。

我该如何解决这个问题?如何正确设置微调器以使其处理默认值、用户选择和先前的选择?

【问题讨论】:

    标签: android kotlin spinner


    【解决方案1】:

    一般来说,如果你在 onItemSelected 的回调中有逻辑,并且你需要以编程方式设置一个项目,通常的做法是:

    (伪代码)

    yourCallback = object: AdapterView.OnItemSelectedListener {
      ...
    }
    
    spinner.setOnItemSelected(null)
    spinner.setValue(...)
    spinner.setOnItemSelected(yourCallback)
    
    

    因此,在强制微调器设置值之前,请务必移除回调。

    “未知”应该是您选项中的一个项目。 Spinner (afaicr) 不支持“null”(自 2016 年我必须最后一次使用它时它可能已经改变),但让 ViewModel 吐出一个值。

    最后,不要在您的 UI (if(!hasSelectedSomething) {) 中执行“如果”,只需让 viewModel 吐出一个值(未知为有效值),然后让您的微调器简单地设置其值。 (记得去掉回调,设置值,再设置回调,防止重复调用)。

    你有一个 ViewModel 是有原因的,让 UI 通过观察微调器的值来简单地对状态变化做出反应。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2014-03-02
      • 2017-12-11
      • 1970-01-01
      • 2012-07-17
      • 2011-12-26
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多