2010-03-03 45 views
14

我正在創建一個spinner,並且我已經爲它添加了一個OnItemSelectedListener。但我注意到它在創建時觸發。 現在我想知道是否有辦法忽略/丟棄它。忽略OnItemSelectedListener在創建時觸發

我知道我可以使用boolean值,但這有點「髒」。

回答

0

如果任何人遇到了這個問題,它可能是值得擁有看看a related question I asked a while ago,其中有幾個答案就如何解決這個問題的好點子。

+0

我與聽者的另一個問題。如果我從OnItemSelected方法觸發一個異步任務,然後旋轉getLastNonConfigurationInstance會爲我在onRetainNonConfigurationInstance上保存的任務返回null。但是如果我把代碼外面的oncreate它會工作得很好.... – Maxrunner 2011-12-21 20:30:19

+0

你沒有告訴你指出我們2你的答案了。 – cosmincalistru 2012-09-26 14:43:11

+3

@cosmincalistru:修正了鏈接 - 我剛剛複製粘貼了當時瀏覽器URL中的內容,但沒有意識到這是一個答案,而不是問題。或許,我會及時原諒自己。 – 2012-09-27 00:17:47

1

您不應該試圖阻止對OnItemSelectedListener的調用。

默認情況下,Android的紗廠選擇由適配器返回的第一個項目,因此OnItemSelectedListener被調用來觸發該項目的一些動作。

我想提醒你的微調適配器的第一個項目是一個空白的項目,您可以OnItemSelectedListener根據ID忽略空白項。

2

這是我的解決方案。

我需要忽略第一個項目選擇事件,因爲Route Grade微調器和Route複選框之間存在依賴關係。

而我所有的控件都是基於上次訪問活動設置的。

// Used to count the number of times the onItemSelected gets fired 
private int mGradeSelectionCount = 0; 

private void attachHandlers() { 
    OnItemSelectedListener gradeRangeSelectionMadeListener; 
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 
      // If the counter is 0 then we can assume that it is android firing the event 
      if (mGradeSelectionCount++ < 1) { 
       return; 
      } 
      if (mCmbGradeFrom.getSelectedItemPosition() == 0) { 
       // Uncheck the Route checkbox 
       mChkTypeRoute.setChecked(false); 
      } else { 
       // Check the Route checkbox 
       mChkTypeRoute.setChecked(true); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // Dont care, keep the same values as before 

     } 
    }; 
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener); 
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       mCmbGradeFrom.setSelection(0); 
       mCmbGradeTo.setSelection(0); 
      } 
     } 
    }); 
} 
1

這可能對你有幫助。

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    if(view!=null && view.getId()!=0){ 
     //do your code here to avoid callback twice 
    } 
} 
+0

沒有工作:-( – sourcerebels 2013-11-12 16:57:01

0

嗯,我想我找到了很好的解決方案對我來說,我是有一點,從開始,但... 我已經基於Android上的處理器定製的包裝類,被稱爲DoLater,也有自定義適配器基於聽衆,所以你不能複製粘貼,但你會明白。危險的事情就是延遲500可能會延長,並且View可能已經被破壞(當用戶快速地做一些有線的事情或者手機變慢時),所以DoLater會關心它,所以當活動沒有恢復時它不會被調用。但是這種方式OnItemSelectedListener不會在創建時觸發。

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
} 
相關問題