设置适配器时如何避免让android spinner调用onitemselected侦听器?

时间:2010-09-03 16:29:45

标签: android android-spinner

看来android的Spinner类(一般可能是ListView,虽然我不确定)在你调用onItemSelected()之后调用你的OnItemSelectedListener的setAdapter()方法,即使用户没有明确选择了任何东西。

我可以看到这在许多情况下会有用,但有时我只想在实际专门选择项目时调用onItemSelected()

有没有办法控制此行为,并且在设置适配器后Spinner不会调用onItemSelected()

4 个答案:

答案 0 :(得分:4)

我已经很久没有使用过这个解决方案了,所以我并不完全相信它能按预期运行,但到目前为止我已经有了这个解决方法的运气:

    spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
        protected Adapter initializedAdapter = null;

        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            // Always ignore the initial selection performed after setAdapter
            if( initializedAdapter !=parent.getAdapter() ) {
                initializedAdapter = parent.getAdapter();
                return;
            }

            ...
        }
    }

有更好的方法吗?

答案 1 :(得分:3)

将侦听器添加到微调器,如下所示:

spinner.post(new Runnable(){
    public void run()
    {
        spinner.setOnItemSelectedListener( new OnItemSelectedListener() {

            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                ...
            }
        }
    }
});

答案 2 :(得分:0)

我使用了setTag和getTag方法,并创建了一个名为“spinnerstate”的resource id

然后,每当我以编程方式设置适配器时,我将“spinnerstate”标记设置为“init”,并在触发事件中将其设置为“ready”并忽略该事件。 (注意我的代码是Mono for Android,它看起来会有所不同):

设置适配器:

profileSpn.SetTag (Resource.Id.spinnerstate, "init");
profileSpn.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, items.ToArray ());

项目选定事件:

    string state = (string)((Spinner)sender).GetTag (Resource.Id.spinnerstate);
    if (state == "init") {
        ((Spinner)sender).SetTag (Resource.Id.spinnerstate, "ready");
        return;
    }

我同意在几乎100%的情况下这不是理想的行为,我不认为这是Google的好设计,但你去了。

答案 3 :(得分:0)

我的活动中有三个微调器,并且所有微调器适配器数据都已在运行时填充(从onCreate方法调用之后的Web服务数据)。因此它会自动调用微调器的onItemSelected(AdapterView<?> parent, View view, int position, long id)方法。 我使用onUserInteraction()活动方法解决了这个问题 检查用户是否与微调器交互的方法。如果是,则执行其他操作

  1. 全局声明 isUserIntract 布尔变量

  2. {li>

    onItemSelected方法中使用以下程序

    如果(isUserIntract) {

    //执行行动

    } 否则{

    //不执行操作

    }

  3. 在活动中使用以下代码

  4. @Override

    public void onUserInteraction() {
    super.onUserInteraction();
    isUserIntract = true;
    }