2011-11-21 9 views
12

Sono una filatrice con onItemSelected dell'interazione che funziona, ma come la specifica Api dice:Spinner onItemSelected con voce già selezionata

Questa richiamata viene richiamata solo quando la posizione appena selezionata è diversa da quella selezionata in precedenza posizione o se non era presente l'elemento selezionato .

Ho bisogno di rimuovere questa limitazione e voglio che la richiamata sia invocata anche se l'utente seleziona lo stesso elemento. Come si fa? Ho letto un suggerimento sull'estensione della classe Spinner e impostare la posizione su INVALID_POSITION, ma non ho capito/in grado di farlo. Qualcuno ha fatto la stessa cosa?

+3

Vorrei poter superare questa domanda 1000 volte. E vorrei che ci fosse una risposta decente. Sono state alla ricerca di ore per cercare di aggirare questa stupida limitazione. – aaronsnoswell

+0

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

risposta

0

È possibile eseguire questa operazione con un adattatore personalizzato, come creare un layout delle proprie viste desiderate, quindi gonfiarlo nell'adattatore personalizzato e poi su onItemClick è possibile ottenere la vista con questa funzione.

Per distinguere ogni vista è necessario impostare il tag di ogni riga.

Probabilmente funziona nelle tue condizioni.

fatemi sapere qualsiasi problema se si dispone

-2

Credo che devi essere memorizzare il valore in una variabile, inizializzare il vairable con -1. E cambia il valore mentre l'utente seleziona lo spinner dell'articolo, se il valore è -1 chiedi all'utente di riselezionare o qualsiasi altra cosa desideri.

@i desidera che venga richiamato anche il callback se l'utente seleziona lo stesso elemento. Android lo farà per te dato che questo è il comportamento predefinito di Android.

+3

"Android lo farà per te dato che questo è il comportamento predefinito di Android." Questo NON è sicuramente il comportamento predefinito. L'impostazione predefinita è (stranamente), per * NON * attivare l'evento, quando si fa clic su una selezione già evidenziata. – Carol

0

perché è stato selezionato nuovamente l'elemento selezionato. Basta dare un pulsante di aggiornamento se si desidera eseguire di nuovo tale attività.

+0

sul mio caso prevengo che l'evento sia attivato sul metodo onCreate, quindi il mio spinner è impostato sul primo elemento. Se ho bisogno di selezionarlo, non posso con questa limitazione. – jedi

0

Questo è l'elemento filatore con modalità finestra personalizzata e whitout promt:

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

l'elemento di matrice in cui il valore di default è putted nella posizione 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> 

Gli elementi di stringa per la matrice con il valore predefinito:

<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> 
... 

E qui il codice per prevenire l'evento attivato su onCrea teMethod e il lavoro intorno per consentire di selezionare lo stesso elemento già selezionato:

@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) {} 
    }); 
} 

speranza aiuta. L'idea viene dalla seconda soluzione da TreKing's answer

0

Utilizzare OnItemClickListener anziché su itemSelectedListener. Funzionerà per ogni clic sia esso stesso o diverso.

+3

Questo non funzionerà affatto. L'impostazione di un OnItemClickListener su Spinner genera un'eccezione! –

+0

puoi dirmi quale eccezione ..? – Athul

+2

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

1

Avevo anche bisogno di una soluzione a questo problema. Quello che volevo fare era avere uno Spinner con intervalli di date con un'opzione di intervallo personalizzato.Le righe sarebbero simile a questa:

10 aprile - 10 maggio
10 marzo-10 Aprile
10 Febbraio-10 Marzo
Intervallo personalizzato

Il problema è che se l'utente seleziona un costume intervallo e quindi desidera modificare il loro intervallo personalizzato, devono selezionare un intervallo diverso e quindi selezionare nuovamente l'opzione intervallo personalizzato. Volevo che l'utente fosse in grado di selezionare nuovamente "Intervallo personalizzato" in modo da poter visualizzare nuovamente la finestra di dialogo dell'intervallo personalizzato.

I subclassed Spinner e creato il mio ascoltatore. Il codice cambia la selezione, ma immediatamente la cambia in modo che nulla sia selezionato. Nel mio ascoltatore ignoro qualsiasi posizione che sia inferiore a zero.

Lo Spinner mostra solo l'ultimo elemento selezionato. Ho creato il mio adattatore personalizzato e specificato cosa visualizzare per ogni vista, ma ciò non dovrebbe essere necessario. Ecco come ho sottoclassato 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); 
} 

} 

Spero che questo aiuti!