我正在创建一个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);
}
};
}
};
}
如果其他人遇到这个问题,可能值得看看我之前问过的一个相关问题,它有几个答案,其中包含关于如何解决这个问题的好主意。