2013-04-02 100 views
6

我有兩個紡紗器,我想互相「排擠」在一個相互排斥的意義上:如果您在一箇中選擇一個項目,該項目的文本變成紅色並出現在頂部,而另一個返回顯示初始(「標題」)選擇(如果先前選擇了另一個項目),並且其文本變爲白色。「同步」兩個紡紗器

這是通過onItemSelected聽衆全部完成:

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, 
       int position, long arg3) {    
      issueSpin.setSelection(0);          
      ((TextView) issueSpin.getChildAt(0)).setTextColor(Color.parseColor("#FFFFFF")); 
      ((TextView) arg1).setTextColor(Color.parseColor("#E3170D")); 
.... 

,反之亦然爲「的問題微調」。我的問題是,如果我要從一個微調器轉到另一個微調器並選擇頂層項目,則onItemSelectedListener不會註冊,因爲所選項目已被選中。

我被告知這是不可能的。或者,我被告知,onItemSelected偵聽器不可能觸發已經選擇的項目。雖然我意識到這在技術上是正確的,但這個問題似乎相對簡單,我相信必須有一個解決方法來產生所需的效果。

我有一些相關的幾個問題,我正在琢磨:

  1. 有什麼辦法來設置在旋轉爲未選中的所有項目,同時還顯示其中之一嗎?
  2. 我可以利用不同類型的事件(即'setOnTouchListener','setOnClickListener'等),大概在最上面的項目上,連同onItemSelectedListener
  3. 我是否應該使用不同類型的事件本身,也許在微調器本身膨脹的視圖中,沒有onItemSelectedListener
  4. 你能幫我找到一個比上面提到的要點更好的策略嗎?

回答

1

而不是使用Spinner,使用一個Button視覺上類似於非活動Spinner。單擊按鈕時,顯示包含ListView的自定義Dialog。您可以使用setSelection方法和/或AdaptergetView中的位置顯示當前選擇哪個項目。 ListViewOnItemClickListener會收到通知,無論項目是否被選中,點擊都會被點擊。

當您找到哪個項目被點擊時,隱藏Dialog並通知包含此按鈕的按鈕Activity,以便它可以根據需要更新Buttons

我已經使用DialogFragmentsDialogFragmentParent實現了一些非常類似的東西,它工作正常。

+0

但是這個應用程序的整體設計至關重要,菜單像一個微調器一樣打開 - 即選項下降。 – drewmoore

+0

@drewmore我給出了一個解決問題中所描述的問題的答案。我首先考慮對Spinner進行子分類並覆蓋負責的方法(如果選擇的項目相同,則明確表示「onItemSelectedListener」未被調用),但這是不可能的,因爲該方法是私有的。如果您需要使用其他方法嚴重影響動畫,則可以模擬動畫。但是,如果我的回答由於某些未在問題原因中披露而無法幫助您,那麼您應該編輯您的問題。 – Shade

1

你有沒有考慮像下面,

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("sectionSpin"); 
    } 
} 

而對於另外一個

issueSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("issueSpin"); 
    } 
} 

現在

private void updateView(String spinner){ 
    if (spinner.equals(sectionSpin)){ 
     //update spinner per requirement 

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

你也可以考慮一些額外的變量或參數如果第一次選擇的項目跟蹤跟蹤。

+0

這仍然依賴於onItemSelected()偵聽器,如果用戶選擇已在頂部的項目,則該偵聽器不會觸發。 – drewmoore

0

因此,您可以使紡紗器中的第一項無效選擇,如「[選擇一個]」或「[選擇標題]」,迫使聽衆每次發射。

這將有額外的好處,你會知道用戶在下一步之前做過選擇。

當然,這取決於期望的應用程序流程。