我正在创建一个spinner
,我已经为其添加了OnItemSelectedListener
。
但是我注意到它会在创建时触发。
现在我想知道是否有办法忽略/丢弃它。
我知道我可以使用boolean
值,但这有点“脏”。
答案 0 :(得分:2)
这是我的解决方案。
我需要忽略第一个项目选择事件,因为Route Grade Spinner和Route Checkbox之间存在依赖关系。
我的所有控件都是根据之前的活动访问设置的。
// 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 :(得分:1)
您不应试图阻止对OnItemSelectedListener
的调用。
默认情况下,Android Spinners选择适配器返回的第一个项目,因此调用OnItemSelectedListener
以触发对该项目的某些操作。
我建议您的Spinner适配器中的第一项是空白项,并且OnItemSelectedListener
可以根据其ID忽略该空白项。
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
如果有其他人遇到这个问题,可能值得查看a related question I asked a while ago,其中有几个答案,并就如何解决此问题提出了很好的建议。
答案 4 :(得分:0)
嗯,我觉得我找到了很好的解决方案,我从一开始就考虑到了这一点,但...... 我有基于Android Handler的自定义包装器类,称为DoLater,还有基于Listener的自定义适配器,所以你不能复制粘贴这个,但你会明白的。危险的事情就是以某种方式延迟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);
}
};
}
};
}