7

即使用户尚未明确选择任何内容,android 的 Spinner 类(也可能是一般的 ListView,尽管我不确定)似乎onItemSelected()在您调用后调用您的 OnItemSelectedListener 方法。setAdapter()

我可以看到这在许多情况下是如何有用的,但有时我只想onItemSelected()在实际专门选择一个项目时被调用。

有没有办法控制这种行为并onItemSelected()在设置适配器后让 Spinner 不调用?

4

5 回答 5

5

我已经很久没有使用这个解决方案了,所以我并不完全相信它可以按预期工作,但是到目前为止我对这个解决方法很幸运:

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

            ...
        }
    }

有没有更好的办法?

于 2010-09-03T16:43:08.170 回答
3

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

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

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

                ...
            }
        }
    }
});
于 2014-03-02T06:57:20.997 回答
0

我使用了setTag和 getTag 方法,并创建了一个名为“ spinnerstate”的资源 ID 。

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

设置适配器:

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% 的情况下都不是理想的行为,而且我认为这不是谷歌的好设计,但你去吧。

于 2013-03-05T20:55:40.203 回答
0

我以前做过类似的事情,我使用计数值。使用父适配器对象是不完整的,因为刷新或getView()再次调用视图时可能会出现问题。

因此,我建议使用计数器数组。

首先,在适配器中全局定义计数数组。

private int isInitializedView[];

然后在 getView() 上对其进行初始化。

isInitializedView[position] = 0;

在选择侦听器中,如果它已经初始化,请执行您想要的操作。

    holder.mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            isInitializedView[position]++;
            if(isInitializedView[position] > 1) {
                // do someting that you want
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {}
    });

(注意,isInitializedView[position]++;可以在if()例程之后,只有当这个值为 时才触发事件>0。这是你的选择。)

于 2014-04-06T04:33:40.790 回答
0

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

  1. 全局声明isUserIntract布尔变量

  2. onItemSelected方法中使用以下程序

    如果(isUserIntract){

    //执行动作

    } 别的{

    //不执行动作

    }

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

@覆盖

public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}
于 2015-08-11T12:26:05.980 回答