不受欢迎的onItemSelected调用

Ved*_*hat 19 android android-spinner

我有36个微调器,我用一些值初始化了.我用过onItemSelectedListener.像往常一样,用户可以与这些微调器交互,触发onItemSeected函数.

一个问题是调用是在init期间进行的,但我在这里找到了它的解决方案并避免使用全局变量"count"并在onItemSelected中执行代码之前检查count> 36.

我的问题是:用户可以选择单击名为"Previous"的按钮,我必须重置一些微调器值.

我尝试在重置微调器之前将count的值更改为0,然后在重置后将其更改回37,但我已经明白只有在每个其他函数执行完毕后才调用onItemSelected,所以它被称为AFTER count即使微调器值在用户选择后立即设置,也会更改回37.

我需要重复刷新一些微调器而不触发onItemSelected函数.有谁能帮我找到解决方案?谢谢.

Ved*_*hat 68

我找到了一个简单的,我认为优雅的解决方案.使用标签.我首先创建了一个名为"tags"的新XML文件,并输入以下代码:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
  <item name="pos" type="id" />
</resources>
Run Code Online (Sandbox Code Playgroud)

每当我自己使用时spin.setSelection(pos),我也会这样做spin.setTag(R.id.pos, pos),所以我将当前位置设置为标签.

然后,在onItemSelected中,我只执行代码if(spin.getTag(R.id.pos) != position),其中position是函数提供的位置变量.这样,我的代码仅在用户进行选择时执行.由于用户已进行选择,因此标签尚未更新,因此在处理完成后,我将标签更新为spin.setTag(R.id.pos, position).

注意:始终使用相同的适配器很重要,或者"位置"变量可能指向不同的元素.

编辑:作为kaciula指出的那样,如果你不使用多个标签,则可以使用简单的版本,那就是spin.setTag(pos)spin.getTag()不需要的XML文件.

  • 如果不需要将多个标签附加到微调器,也可以使用setTag(pos)的简化版本.这样您就不需要为密钥创建xml文件. (9认同)
  • 我在这里实现了代码:http://pastebin.com/Jv1Wc70D,以防有人需要它. (5认同)

Ivo*_*nov 16

当使用Spinner.setSelection(position)时,它总是激活setOnItemSelectedListener()

为避免两次触发代码,我使用此解决方案:

     private Boolean mIsSpinnerFirstCall = true;

    ...
    Spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            //If a new value is selected (avoid activating on setSelection())
            if(!mIsSpinnerFirstCall) {
                // Your code goes gere
            }
            mIsSpinnerFirstCall = false;
        }

        public void onNothingSelected(AdapterView<?> arg0) {
        }
    });
Run Code Online (Sandbox Code Playgroud)


use*_*328 5

我不知道这个解决方案是否像这里选择的解决方案一样万无一失,但它对我来说效果很好,而且看起来更简单:

boolean executeOnItemSelected = false;
spinner.setSelection(pos)
Run Code Online (Sandbox Code Playgroud)

然后在OnItemSelectedListener中

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    if(executeOnItemSelected){
        //Perform desired action
    } else {
        executeOnItemSelected = true;
    }
}
Run Code Online (Sandbox Code Playgroud)