如何在不触发onItemSelected的情况下设置Spinner项目

9
有没有可能在不调用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);

要回到先前的选择,但这会重新创建视图,而我不想这样做,因为我已经在视图中了,我只想在下拉框中显示我在视图中。


尝试刷新适配器。 - Narendra Singh
@NarendraDroidWorm,这只是重新构建列表,并将选择位置设置为“0”,与调用上次选择的setSelection没有太大区别。 - tyczj
发布你当前的代码,代码能够描述更多的内容。 - stinepike
@StinePike 添加的代码 - tyczj
如果我没记错的话,你的问题是在取消后对话框再次显示了.. 对吗? - stinepike
@StinePike 不,之前选择的视图会被重新创建,但实际上并不需要这样做,因为对话框是/已经显示在其上方,所以当对话框关闭时仍然可见,无需重新创建。其中一个视图在后台进行了大量加载,如果用户正在该视图上,则不希望它再次不必要地加载。 - tyczj
2个回答

6

非常简单!

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 监听器中时,由于 2020 年仍存在 init 错误的 bug,非常容易导致该方法自行执行!

因此,以下是我解决这个问题的方法!


1
据我所知,没有办法停止函数的调用。但是,您可以选择使用简单的if语句(当您使用setSelection时)来不执行函数中的代码。请查看此处的已接受答案:

不想要的onItemSelected调用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接