忽略在创建时触发的OnItemSelectedListener

时间:2010-03-03 18:35:22

标签: android android-spinner onitemclicklistener

我正在创建一个spinner,我已经为其添加了OnItemSelectedListener。 但是我注意到它会在创建时触发。 现在我想知道是否有办法忽略/丢弃它。

我知道我可以使用boolean值,但这有点“脏”。

5 个答案:

答案 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);
                        }
                    };
                }
            };
}