忽略在创建时触发OnItemSelectedListener。

14
我正在创建一个 spinner,并给它添加了一个 OnItemSelectedListener。不过我发现它在创建时就被触发了。 我想知道是否有一种方法可以忽略或丢弃这个事件。
我知道我可以使用一个 boolean 值,但这有点 "不好"。
5个回答

2

这是我的解决方案。

我需要忽略第一个项目的选择事件,因为路线等级微调器和路线复选框之间存在依赖关系。

而且,所有的控件都是基于先前访问该活动设置的。

// 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

这可能对你有所帮助。

@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 
    }
}

1

您不应该试图阻止对OnItemSelectedListener的调用。

默认情况下,Android Spinners选择Adapter返回的第一项,因此会调用OnItemSelectedListener以在该项上触发某些操作。

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


0

我想我找到了适合我的好解决方案,刚开始我就有这个想法,但是...... 我有一个基于 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);
                        }
                    };
                }
            };
}

0

如果有其他人遇到了这个问题,不妨看看我之前提出的一个相关问题,其中有几个答案提供了解决此问题的好方法。


我在监听器方面有另一个问题。如果我在OnItemSelected方法中触发异步任务,然后旋转屏幕,getLastNonConfigurationInstance将为保存在onRetainNonConfigurationInstance中的任务返回null。但如果我把代码放在oncreate外面,它就会正常工作... - Maxrunner
3
@cosmincalistru: 修复了链接 - 我只是复制并粘贴了当时浏览器中的URL,没有意识到它是一个答案而不是问题。也许,时间久了,我会原谅自己。 - Amos M. Carpenter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接