看来Android的Spinner类(尽管我不确定,但通常是ListView)致电您的OnItemSelectedListener onItemSelected() 打电话后的方法 setAdapter(), ,即使用户尚未明确选择任何内容。

我可以看到在许多情况下这将如何有用,但是有时候我只想要 onItemSelected() 实际选择项目时要调用。

有没有办法控制这种行为并让旋转器不打电话 onItemSelected() 设置适配器之后?

有帮助吗?

解决方案

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

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

            ...
        }
    }

有没有更好的办法?

其他提示

如下所示,将听众添加到旋转器中:

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

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

                ...
            }
        }
    }
});

我用过了 Settag 和getTag方法,并创建了一个 资源ID 称为“ Spinnerstate”。

然后,每当我编程设置适配器时,我都会将“ Spinnerstate”标签设置为“ Init”,在射击事件中,将其设置为“准备就绪”并忽略事件。 (请注意,我的代码是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%的案例中,这不是所需的行为,而且我认为Google的设计并不是一个好的设计,但是您可以去。

我以前做过类似的事情,我使用了计数值。使用父适配器对象不完整,因为当视图刷新或 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 。这是你的选择。)

我的活动中有三个旋转器,并且所有旋转器适配器数据都在运行时填充(来自通话后的网络服务数据 onCreate 方法)。因此它会自动调用 onItemSelected(AdapterView<?> parent, View view, int position, long id) 旋转器的方法。我通过使用 onuserInteraction() 活动方法检查用户是否与旋转器进行交互的方法。如果是,请执行其他行动

  1. 宣布 iSererwress 全球布尔变量

  2. onItemSelected 方法使用以下过程

    if(iSuserNtract){

    //执行操作

    } 别的{

    //不执行动作

    }

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

@Override

public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top