我正在创建一个spinner
,并且我已经为它添加了一个OnItemSelectedListener
。但我注意到它在创建时触发。 现在我想知道是否有办法忽略/丢弃它。忽略OnItemSelectedListener在创建时触发
我知道我可以使用boolean
值,但这有点“脏”。
我正在创建一个spinner
,并且我已经为它添加了一个OnItemSelectedListener
。但我注意到它在创建时触发。 现在我想知道是否有办法忽略/丢弃它。忽略OnItemSelectedListener在创建时触发
我知道我可以使用boolean
值,但这有点“脏”。
如果任何人遇到了这个问题,它可能是值得拥有看看a related question I asked a while ago,其中有几个答案就如何解决这个问题的好点子。
您不应该试图阻止对OnItemSelectedListener
的调用。
默认情况下,Android的纱厂选择由适配器返回的第一个项目,因此OnItemSelectedListener
被调用来触发该项目的一些动作。
我想提醒你的微调适配器的第一个项目是一个空白的项目,您可以OnItemSelectedListener
根据ID忽略空白项。
这是我的解决方案。
我需要忽略第一个项目选择事件,因为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);
}
}
});
}
这可能对你有帮助。
@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
}
}
没有工作:-( – sourcerebels 2013-11-12 16:57:01
嗯,我想我找到了很好的解决方案对我来说,我是有一点,从开始,但... 我已经基于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);
}
};
}
};
}
我与听者的另一个问题。如果我从OnItemSelected方法触发一个异步任务,然后旋转getLastNonConfigurationInstance会为我在onRetainNonConfigurationInstance上保存的任务返回null。但是如果我把代码外面的oncreate它会工作得很好.... – Maxrunner 2011-12-21 20:30:19
你没有告诉你指出我们2你的答案了。 – cosmincalistru 2012-09-26 14:43:11
@cosmincalistru:修正了链接 - 我刚刚复制粘贴了当时浏览器URL中的内容,但没有意识到这是一个答案,而不是问题。或许,我会及时原谅自己。 – 2012-09-27 00:17:47