14

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

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

4

5 回答 5

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);
            }
        }
    });
}
于 2013-01-08T11:29:45.223 回答
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 
    }
}
于 2013-09-27T15:57:12.297 回答
1

您不应试图阻止对OnItemSelectedListener.

默认情况下,Android Spinner 会选择 Adapter 返回的第一个项目,因此OnItemSelectedListener会调用 来触发对该项目的某些操作。

我建议您的 Spinner Adapter 中的第一项是空白项,您OnItemSelectedListener可以根据其 ID 忽略该空白项。

于 2011-12-23T21:45:08.940 回答
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);
                        }
                    };
                }
            };
}
于 2014-02-17T10:13:26.820 回答
0

如果其他人遇到这个问题,可能值得看看我之前问过的一个相关问题,它有几个答案,其中包含关于如何解决这个问题的好主意。

于 2011-11-15T05:58:47.473 回答