我正在创建一个spinner
并添加了一个OnItemSelectedListener
。但是我注意到它在创建时触发。现在我想知道是否有办法忽略/丢弃它。
我知道我可以使用一个boolean
值,但这有点“脏”。
我正在创建一个spinner
并添加了一个OnItemSelectedListener
。但是我注意到它在创建时触发。现在我想知道是否有办法忽略/丢弃它。
我知道我可以使用一个boolean
值,但这有点“脏”。
这是我的解决方案。
我需要忽略第一个项目选择事件,因为 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);
}
}
});
}
这可能会对您有所帮助。
@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
}
}
您不应试图阻止对OnItemSelectedListener
.
默认情况下,Android Spinner 会选择 Adapter 返回的第一个项目,因此OnItemSelectedListener
会调用 来触发对该项目的某些操作。
我建议您的 Spinner Adapter 中的第一项是空白项,您OnItemSelectedListener
可以根据其 ID 忽略该空白项。
好吧,我想我为我找到了很好的解决方案,我从一开始就想到了它,但是......我有基于 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);
}
};
}
};
}
如果其他人遇到这个问题,可能值得看看我之前问过的一个相关问题,它有几个答案,其中包含关于如何解决这个问题的好主意。