2011-11-21 73 views
12

我已經與onItemSelected互爲作用的作品,但API規範如何說一個微調:微調onItemSelected與項目已經選定

此調用回調函數,只有當新選擇的位置是 從先前選定的不同位置或如果沒有 所選項目。

我需要刪除這個限制,我想的是,調用回調函數還,如果用戶選擇相同的元素。 如何做到這一點?我讀了一個關於擴展Spinner類的建議,並將位置設置爲INVALID_POSITION,但我還沒有理解/能夠做到這一點。 任何人都做過同樣的事情?

+3

希望我可以upvote這個問題1000倍。我希望有一個體面的答案。一直在尋找幾個小時試圖繞過這個愚蠢的限制。 – aaronsnoswell

+0

http://stackoverflow.com/a/11323043/2798289 – Govind

回答

0

您可以通過自定義適配器做到這一點,就像創建你的慾望意見的佈局,然後再上onItemClick自定義適配器誇大該功能你可以通過這個功能的看法。

要區分每個視圖,您必須設置每行的標記。

它可能適用於您的情況。

讓我知道的任何問題,如果你有

-2

我猜你一定在某個變量存儲的值,初始化vairable爲-1。並且在用戶選擇項目微調器時更改該值,如果該值爲-1,則請求用戶重新選擇或想要的任何內容。

@i希望如果用戶選擇相同的元素,也會調用回調。 Android會爲你做這個,因爲這是android的默認行爲。

+3

「Android會爲你做這個,因爲這是android的默認行爲。」這絕對不是默認行爲。默認情況下(奇怪的是),當你點擊一個已經突出顯示的選擇時,就* *觸發事件。 – Carol

0

爲什麼您再次選擇所選項目。如果您想再次執行該任務,只需提供刷新按鈕即可。

+0

對我的情況我防止它在onCreate方法上被觸發的事件,然後我的微調它被設置在第一個元素上。如果我需要選擇它,我不能有這個限制。 – jedi

0

這是所說的紡絲器元件,具有定製對話框模式和whitout PROMT:

<Spinner 
    android:id="@+id/spinner_metatag" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/search_adv" 
/> 

其中缺省值是在位置0推杆數組元素:

<string-array name="search_adv"> 
    <item>@string/search_adv_prompt</item> 
    <item>@string/search_adv_title</item> 
    <item>@string/search_adv_desc</item> 
    <item>@string/search_adv_autore</item> 
    .... 
</string-array> 

用於陣列字符串元素與默認值:

<string name="search_adv_prompt">Scegli un metatag</string> <!-- Default value--> 
<string name="search_adv_title">Titolo</string> 
<string name="search_adv_desc">Descrizione</string> 
<string name="search_adv_autore">Autore</string> 
... 

而這裏的代碼,以防止在onCrea上發生的事件teMethod和周圍的工作以允許選擇已經選擇的相同元素:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.search_adv_main); 

    spinner = (Spinner) findViewById(R.id.spinner_metatag); 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) { 
      //prevent onCreate event fire and the loop 
      if(pos==0) 
       return; 

      //HERE YOUR CODE 

      //at the end move to the default element the spinner 
      spinner.setSelection(0); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) {} 
    }); 
} 

希望有所幫助。這個想法來自第二個解決方案TreKing's answer

0

使用OnItemClickListener而不是itemSelectedListener.That將適用於每次點擊,無論它是相同還是不同。

+3

這根本不起作用。在Spinner上設置OnItemClickListener會引發異常! –

+0

你能告訴我哪個例外..? – Athul

+2

http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) 它是RuntimeException。 –

1

我還需要解決這個問題。我想要做的是有一個微調,具有自定義範圍選項的日期範圍。該行會是這個樣子:

4月10日 - 5月10
3月10日至四月10日
二月10日至3月10日
自定義範圍

的問題是,如果用戶選擇了一個自定義然後想要更改自定義範圍,則必須選擇不同的範圍,然後再次選擇自定義範圍選項。我希望用戶能夠再次選擇「自定義範圍」,以便自定義範圍對話框可以再次顯示。

我分類了Spinner並創建了我自己的偵聽器。代碼切換選擇,但是立即切換它,以便不選擇任何內容。在我的聽衆中,我忽略了小於零的任何位置。

微調器只顯示最後選擇的項目。我創建了自己的自定義適配器,並指定要爲每個視圖顯示的內容,但這不應該是必需的。以下是我如何分類Spinner。

package com.example.widget; 

import android.content.Context; 
import android.widget.Spinner; 

public class DateRangeSpinner extends Spinner { 

private ItemSelectionListener listener; 

public DateRangeSpinner(Context context) { 
    super(context); 
} 

/** 
* This listener will be fired every time an item is selected, 
* regardless of whether it has already been selected or not. 
* 
* @param l 
*/ 
public void setOnItemSelectedListener(ItemSelectionListener l) { 
    listener = l; 
} 

public void removeOnItemSelectedListener() { 
    listener = null; 
} 

@Override 
public void setSelection(int position) { 
    setSelection(position, true); 
} 

@Override 
public void setSelection(int position, boolean animate) { 
    if (listener != null) { 
     listener.onItemSelected(position); 
    } 
    super.setSelection(position, animate); 
    super.setSelection(-1, animate); 
} 

public interface ItemSelectionListener { 
    public void onItemSelected(int position); 
} 

} 

我希望這有助於!

相關問題