2010-09-03 46 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; 
} 
相關問題