我正在创建一个
我知道我可以使用一个
spinner
,并给它添加了一个 OnItemSelectedListener
。不过我发现它在创建时就被触发了。
我想知道是否有一种方法可以忽略或丢弃这个事件。我知道我可以使用一个
boolean
值,但这有点 "不好"。spinner
,并给它添加了一个 OnItemSelectedListener
。不过我发现它在创建时就被触发了。
我想知道是否有一种方法可以忽略或丢弃这个事件。boolean
值,但这有点 "不好"。这是我的解决方案。
我需要忽略第一个项目的选择事件,因为路线等级微调器和路线复选框之间存在依赖关系。
而且,所有的控件都是基于先前访问该活动设置的。
// 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 Spinners选择Adapter返回的第一项,因此会调用OnItemSelectedListener
以在该项上触发某些操作。
我建议您在Spinner Adapter中的第一项是一个空白项,并且您的OnItemSelectedListener
可以根据其id忽略该空白项。
我想我找到了适合我的好解决方案,刚开始我就有这个想法,但是...... 我有一个基于 Android Handler 的自定义包装类,名为DoLater,还有一个基于Listener的自定义Adapter,因此您不能复制粘贴此内容,但您会得到思路。危险之处在于,某种方式,500毫秒的延迟可能太长,视图可能已经被销毁(当用户快速执行某些奇怪的操作或手机变慢时...),所以DoLater会关心这一点,因此在活动未恢复时不会调用它。但这样OnItemSelectedListener将不会在创建时触发。
public void onResume() {
super.onResume();
new DoLater(this, 500) {
public void run() {
new OnSpinnerSelectedAdapter(getBowSpinner()) {
protected void onItemSelected(int position) {
onBowSelected(position);
}
};
}
};
}
如果有其他人遇到了这个问题,不妨看看我之前提出的一个相关问题,其中有几个答案提供了解决此问题的好方法。