【问题标题】:How to set Spinner item without onItemSelected getting called如何在不调用 onItemSelected 的情况下设置 Spinner 项目
【发布时间】:2020-04-26 03:59:53
【问题描述】:

是否可以在不调用onItemSelected 方法的情况下将选定的微调器位置更改为某个值?

基本上我要做的是返回微调器中先前选择的项目,因为其中一个项目在选择时会显示一个对话框。当用户点击后退按钮时,微调器仍然显示他们在对话框被关闭时显示的位置。

那么有没有办法在使用spinner.setSelection(position) 恢复时防止它被调用,或者有没有办法让显示对话框的位置保持选中状态?

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
    switch(arg2){
    case 0:

        previousSelection = 1;
        mNavButtonClick.onNavButtonClick(1);

        break;
    case 1:
        previousSelection = 2;
        mNavButtonClick.onNavButtonClick(2);

        break;
    case 2:
        previousSelection = 3;
        mNavButtonClick.onNavButtonClick(3);
        break;
    case 3:
        previousSelection = 4;
        mNavButtonClick.onNavButtonClick(4);
        break;
    case 4:
        previousSelection = 5;
        mNavButtonClick.onNavButtonClick(5);
        break;
    case 5:
                    //this case shows the dialog
        mNavButtonClick.onNavButtonClick(6);
        break;
    default:
        break;
    }
}

显示对话框,用户单击后退按钮关闭对话框并在onDismiss 中调用

spinner.setSelection(previousSelection);

返回之前的选择,但这会重新创建我不想要的视图,因为我已经在视图中,我只想显示我在微调器中的视图上

【问题讨论】:

  • 尝试刷新适配器。
  • @NarendraDroidWorm 只是要重建列表,将选择位置设置为0,这与在最后选择的位置调用setSelection 并没有太大区别
  • 发布你当前的代码,代码比文字描述的更多
  • @StinePike 代码添加
  • 所以如果我没记错的话,你的问题是取消后对话框再次显示......对吗?

标签: android android-spinner


【解决方案1】:

很简单!

spinner.adapter = adapter
spinner.setSelection(pos) // whatever integer!
spinner.setTag("bug init")
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(p0: AdapterView<*>?) = Unit
        override fun onItemSelected(p0: AdapterView<*>?, p1: View?, position: Int, p3: Long) {

        if (spinner.getTag().equals("bug init")) {
            spinner.setTag("okay, no more bug")
        }
        else {
            whateverMethod()
        }
}

当你把方法调用放在 spinner listener 中时,由于 init 的 bug 在 2020 年仍然存在,方法执行 self 的风险很大!

所以,我就是这样解决的!

【讨论】:

    【解决方案2】:

    AFAIK,没有办法停止被调用的函数。但是,您可以选择不使用简单的 if 执行函数中的代码(当您使用 setSelection 时)在此处查看接受的答案:

    Undesired onItemSelected calls

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多