代码之家  ›  专栏  ›  技术社区  ›  emmby

如何避免在设置适配器时让Android Spinner调用itemselectedListener?

  •  6
  • emmby  · 技术社区  · 14 年前

    似乎Android的spinner类(可能是listview,虽然我不确定)调用了您的OnitemSelectedListener onItemSelected() 调用后的方法 setAdapter() ,即使用户尚未显式选择任何内容。

    我知道这在很多情况下是多么有用,但有时我只想 OnItemSelected()。 当一个项目实际被特别选中时被调用。

    有没有办法控制这种行为,让spinner不调用 OnItemSelected()。 设置适配器之后?

    5 回复  |  直到 7 年前
        1
  •  4
  •   emmby    14 年前

    我已经很长时间没有使用这个解决方案了,所以我不完全相信它能像预期的那样工作,但是到目前为止,我在这个解决方案方面已经很幸运了:

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

    有更好的方法吗?

        2
  •  3
  •   spgodara    11 年前

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

    spinner.post(new Runnable(){
        public void run()
        {
            spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
    
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
                    ...
                }
            }
        }
    });
    
        3
  •  0
  •   Luke T O'Brien    12 年前

    我已经用过了 setTag 和gettag方法,并创建了 resource id 称为“自旋体状态”。

    然后,每当我以编程方式设置适配器时,我都将“spinnerstate”标记设置为“in it”,在激发的事件中,将其设置为“ready”并忽略该事件。(请注意,我的代码对于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的好设计,但你看。

        4
  •  0
  •   Seongeun So    11 年前

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

        5
  •  0
  •   Amandeep Rohila    9 年前

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

    1. 申报 ISUSER内幕 全局布尔变量

    2. 在里面 onItemSelected 方法使用以下程序

      如果(isuserict) {

      //执行操作

      } 否则{

      //不执行操作

      }

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

    @重写

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