如何设置Spinner项而不调用onItemSelected

时间:2013-05-08 18:39:03

标签: android android-spinner

是否可以在不调用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);

回到之前的选择,但这又重新创建了我不想要的视图,因为我已经在视图中我只想表明我在旋转器中的视图

2 个答案:

答案 0 :(得分:2)

非常简单!

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()
        }
}

当您将方法调用放入微调监听器中时,由于init的错误在2020年仍将存在,因此该方法将自行执行的风险非常大!

所以,这就是我解决的方法!

答案 1 :(得分:1)

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

Undesired onItemSelected calls