2010-09-03 100 views
6

看起来,即使用户尚未明确选择任何东西,但在调用setAdapter()之后,Android的Spinner类(以及一般情况下可能的ListView,尽管我不确定)在调用setAdapter()后调用OnItemSelectedListener的方法onItemSelected()如何在设置适配器时避免让android spinner调用itemselectedlistener?

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

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

回答

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

      ... 
     } 
    } 

是否有更好的方法?

+2

如果用户按动的第一个项目的上面的代码没有效果。 – matheuslf 2013-07-12 19:59:56

+0

我正面临同样的问题 – theLazyFinder 2016-07-20 10:24:56

0

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

然后,无论何时我以编程方式设置适配器,我将“spinnerstate”标记设置为“init”,并在触发事件中将其设置为“ready”并忽略该事件。 (请注意我的代码是单声道的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%的情况下,我认为这不是谷歌的良好设计,但你去了。

2

添加监听器,微调器象下面这样:

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

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

       ... 
      } 
     } 
    } 
}); 
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。这是你的选择。)

0

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

  1. 声明isUserIntract布尔变量全局

  2. onItemSelected方法使用以下过程

    如果(isUserIntract) {

    //执行动作

    } 否则{

    //不执行动作

    }在活动下方代码

  3. 使用

@Override

public void onUserInteraction() { 
super.onUserInteraction(); 
isUserIntract = true; 
} 
相关问题