2010-03-03 68 views
14

我正在创建一个spinner,并且我已经为它添加了一个OnItemSelectedListener。但我注意到它在创建时触发。 现在我想知道是否有办法忽略/丢弃它。忽略OnItemSelectedListener在创建时触发

我知道我可以使用boolean值,但这有点“脏”。

回答

0

如果任何人遇到了这个问题,它可能是值得拥有看看a related question I asked a while ago,其中有几个答案就如何解决这个问题的好点子。

+0

我与听者的另一个问题。如果我从OnItemSelected方法触发一个异步任务,然后旋转getLastNonConfigurationInstance会为我在onRetainNonConfigurationInstance上保存的任务返回null。但是如果我把代码外面的oncreate它会工作得很好.... – Maxrunner 2011-12-21 20:30:19

+0

你没有告诉你指出我们2你的答案了。 – cosmincalistru 2012-09-26 14:43:11

+3

@cosmincalistru:修正了链接 - 我刚刚复制粘贴了当时浏览器URL中的内容,但没有意识到这是一个答案,而不是问题。或许,我会及时原谅自己。 – 2012-09-27 00:17:47

1

您不应该试图阻止对OnItemSelectedListener的调用。

默认情况下,Android的纱厂选择由适配器返回的第一个项目,因此OnItemSelectedListener被调用来触发该项目的一些动作。

我想提醒你的微调适配器的第一个项目是一个空白的项目,您可以OnItemSelectedListener根据ID忽略空白项。

2

这是我的解决方案。

我需要忽略第一个项目选择事件,因为Route Grade微调器和Route复选框之间存在依赖关系。

而我所有的控件都是基于上次访问活动设置的。

// Used to count the number of times the onItemSelected gets fired 
private int mGradeSelectionCount = 0; 

private void attachHandlers() { 
    OnItemSelectedListener gradeRangeSelectionMadeListener; 
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 
      // If the counter is 0 then we can assume that it is android firing the event 
      if (mGradeSelectionCount++ < 1) { 
       return; 
      } 
      if (mCmbGradeFrom.getSelectedItemPosition() == 0) { 
       // Uncheck the Route checkbox 
       mChkTypeRoute.setChecked(false); 
      } else { 
       // Check the Route checkbox 
       mChkTypeRoute.setChecked(true); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // Dont care, keep the same values as before 

     } 
    }; 
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener); 
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       mCmbGradeFrom.setSelection(0); 
       mCmbGradeTo.setSelection(0); 
      } 
     } 
    }); 
} 
1

这可能对你有帮助。

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    if(view!=null && view.getId()!=0){ 
     //do your code here to avoid callback twice 
    } 
} 
+0

没有工作:-( – sourcerebels 2013-11-12 16:57:01

0

嗯,我想我找到了很好的解决方案对我来说,我是有一点,从开始,但... 我已经基于Android上的处理器定制的包装类,被称为DoLater,也有自定义适配器基于听众,所以你不能复制粘贴,但你会明白。危险的事情就是延迟500可能会延长,并且View可能已经被破坏(当用户快速地做一些有线的事情或者手机变慢时),所以DoLater会关心它,所以当活动没有恢复时它不会被调用。但是这种方式OnItemSelectedListener不会在创建时触发。

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
}