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>
每当我自己使用时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文件.
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) {
        }
    });
我不知道这个解决方案是否像这里选择的解决方案一样万无一失,但它对我来说效果很好,而且看起来更简单:
boolean executeOnItemSelected = false;
spinner.setSelection(pos)
然后在OnItemSelectedListener中
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    if(executeOnItemSelected){
        //Perform desired action
    } else {
        executeOnItemSelected = true;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 20194 次 | 
| 最近记录: |