Imposta a livello di codice la voce di filatore selezionata


384

Sto lavorando a un progetto Android e sto usando uno spinner che utilizza un adattatore di array che viene popolato dal database.

Non riesco a scoprire come posso impostare l'elemento selezionato a livello di codice dall'elenco. Ad esempio se nello spinner ho i seguenti elementi:

  • Categoria 1
  • Categoria 2
  • Categoria 3

Come farei a livello di codice rendere Categoria 2 l'elemento selezionato quando viene creato lo schermo. Stavo pensando che potrebbe essere simile a c # IE Spinner.SelectedText = "Categoria 2" ma non sembra esserci alcun metodo simile a questo per Android.


Segui questo link: [Come impostare la selezione sulla voce Spinner] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy,

1
Puoi passare il tuo indice in spinner.setSelection(). Funzionerebbe perfettamente. Puoi anche creare un metodo che può aiutarti a far corrispondere i tuoi indici alle stringhe effettive.
Taslim Oseni,

Risposte:


737

Utilizzare i seguenti: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


287
Grazie, ha funzionato alla grande, mentre lo facevo ho anche trovato un modo per ottenere l'indice senza dover passare in rassegna l'adattatore. Ho usato il seguentemySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy il

86
nel caso in cui non si abbia l'adattatore di riferimento. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()) getPosition ( "Value").);
Kalel Wade,

3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead,

chiamando SetSelection () subito dopo setAdapter () sembra visualizzare sempre il 1 ° elemento (Android 2.3), anche quello buono viene selezionato in dropView. aggiungendo view.post () (@Marco Hernaiz Cao answer) risolvilo per me.
Cristo,

3
Questo non funziona se lo Spinner ha un onItemSelectedListener (). Il listener non verrà chiamato.
Don Larynx,

80

Nessuna di queste risposte mi ha dato la soluzione, ha funzionato solo con questo:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});

3
Chiamo SetSelection () subito dopo setAdapter (). Questo mostra sempre il primo elemento (Android 2.3), anche quello buono è selezionato in dropView. La tua soluzione l'ha fatto per me.
Cristo,

2
Grazie, ha funzionato! btw funziona anche per ListView.post.run () performItemClick ()
Michael D.

Come posso selezionare l'ultimo in base alla dimensione?
jvargas,

41
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}

È possibile utilizzare quanto sopra come:

selectSpinnerItemByValue(spinnerObject, desiredValue);

e ovviamente puoi anche selezionare per indice direttamente come

spinnerObject.setSelection(index);

Un errore con questo codice è che @Boardy vuole che la selezione di Category 2cui suppongo sia una stringa (supponendo che abbia provato a usare Spinner.SelectedText = "Category 2") ma il codice sopra è per a long.
Arun George,

Sta popolando le categorie dal database ci deve essere un ID per ogni categoria.
Yaqub Ahmad,

1
Perché presumere che sia un CursorAdapter? SpinnerAdapter funziona altrettanto bene.
Greg Ennis,

Penso che tu abbia un errore qui, dovrebbe essere adapter.getItem(position), no adapter.getItemId(position).
Vadim Kotov,

29

Qualche spiegazione (almeno per i frammenti - mai provato con pura attività). Spero che aiuti qualcuno a capire meglio Android.

La risposta più popolare di Arun George è corretta ma in alcuni casi non funziona.
La risposta di Marco HC utilizza Runnable che è l'ultima risorsa a causa del carico aggiuntivo della CPU.

La risposta è: dovresti semplicemente scegliere il posto corretto da chiamare a setSelection () , ad esempio funziona per me:

@Override
public void onResume() {
    super.onResume();

    yourSpinner.setSelection(pos);
 }

Ma non funzionerà in onCreateView () . Sospetto che sia questo il motivo dell'interesse per questo argomento.

Il segreto è che con Android non puoi fare tutto quello che vuoi in qualsiasi metodo - oops :( - i componenti potrebbero non essere pronti. Come altro esempio - non puoi scorrere ScrollView né in onCreateView () né in onResume () ( vedi la risposta qui )


Grazie - Non sapevo che i frammenti avessero il metodo onResume.
ToolmakerSteve

Vorrei poter dare un +18 in modo che la tua risposta sia sopra @ HC Marco. Sei l'unico che cerca di fare le cose nel modo in cui è destinato a essere fatto
vedant

15

Per trovare un valore e selezionarlo:

private void selectValue(Spinner spinner, Object value) {
    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).equals(value)) {
            spinner.setSelection(i);
            break;
        }
    }
}

12

Perché non usi i tuoi valori dal DB e li memorizzi in un ArrayList e poi usi semplicemente:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));

1
Le varie soluzioni che utilizzano DataAdapter non hanno funzionato per me, ma utilizzando ArrayList da cui sono stati creati i valori in questo esempio ha funzionato.
ewall

8

La soluzione ottimale è:

    public String[] items= new String[]{"item1","item2","item3"};
    // here you can use array or list 
    ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
    final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);

Per ottenere la posizione dell'elemento aggiungere automaticamente la seguente dichiarazione

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));

7

Puoi fare un metodo generico per questo tipo di lavoro come faccio nella mia UtilityClass che è

public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
    for(int i=0;i<array.length;i++) {
        if(array[i].equals(text)) {
            spinner.setSelection(i);
        }
    }
}

5

Puoi impostare facilmente in questo modo: spinner.setSelection(1)invece di 1, puoi impostare qualsiasi posizione dell'elenco che desideri mostrare.


4

Ho un SimpleCursorAdapter, quindi devo duplicare i dati per usare il respose in questo post. Quindi, ti consiglio di provare in questo modo:

for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
    if (spinnerRegion.getItemIdAtPosition(i) == Integer
        .valueOf(signal.getInt(signal
            .getColumnIndexOrThrow("id_region")))) {
        spinnerRegion.setSelection(i);
        break;
    }
}

Penso che sia un modo reale


1
sì, in caso di SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) fornisce un cursore, che può essere utilizzato per ottenere le colonne.
lalitm,

3

Questo è lavoro per me.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);

che dire del +1?
SHADOW.NET,

Perché è iniziato da 0, quindi dobbiamo aggiungerne uno per ottenere la risposta giusta
Arpit Patel,

2

Se hai un elenco di contatti puoi farlo per questo:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));

2

So che ha già risposto, ma un semplice codice per selezionare un elemento, molto semplice:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );

2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }

4
Potresti aggiungere un po 'di testo per spiegare la tua risposta?
Kmeixner,

2

Questo è indicato nei commenti altrove in questa pagina ma ha ritenuto utile estrarlo in una risposta:

Quando si utilizza un adattatore, ho scoperto che è spinnerObject.setSelection(INDEX_OF_CATEGORY2)necessario che si verifichino dopo la setAdapterchiamata; in caso contrario, il primo elemento è sempre la selezione iniziale.

// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);

Ciò è confermato rivedendo il codice AbsSpinner per setAdapter.


Ovviamente, puoi selezionare un articolo solo dopo che l'adattatore è stato riempito.
CoolMind,

2

Questo è quello che uso in Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))

se indexOfnon è possibile effettuare una corrispondenza, viene restituito -1, il che sembra determinare il valore predefinito selezionato da spinner.setSelection. Sto bene con quello.
lasec0203,

0

Nel mio caso, questo codice mi ha salvato la giornata:

public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SpinnerAdapter adapter = spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}

Non è necessario farlo. L'adattatore ha una chiamata getPosition (item) che restituisce int position.
dal

0

Il più delle volte spinner.setSelection(i); //i is 0 to (size-1) of adapter's size non funziona. Se hai appena chiamatospinner.setSelection(i);

Dipende dalla tua logica.

Se la vista è completamente caricata e vuoi chiamarla dall'interfaccia ti suggerisco di chiamare

spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size

O se vuoi cambiare tra il ciclo di vita di attività / frammento, chiama in questo modo

spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setSelection(i);
  }
});

0

Avevo fatto alcune funzioni di estensione Spinnerper il caricamento dei dati e il monitoraggio della selezione degli articoli.

Spinner.kt

fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
    adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, items).apply {
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    }

    if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}

inline fun Spinner.onItemSelected(
    crossinline itemSelected: (
        parent: AdapterView<*>,
        view: View,
        position: Int,
        id: Long
    ) -> Unit
) {
    onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
            itemSelected.invoke(parent, view, position, id)
        }
    }
}

Esempio di utilizzo

val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"

// load data to spinner
your_spinner.load(context, list, defaultData)

// load data without default selection, it points to first item
your_spinner.load(context, list)

// for watching item selection
your_spinner.onItemSelected { parent, view, position, id -> 
    // do on item selection
}

-1

Questo ha funzionato per me:

@Override
protected void onStart() {
    super.onStart();
    mySpinner.setSelection(position);
}

È simile alla soluzione di @ sberezin ma chiama setSelection () in onStart ().


-1

Ho avuto lo stesso problema da ieri. Sfortunatamente il primo elemento nell'elenco di array è mostrato per impostazione predefinita nel widget Spinner. Una svolta sarebbe quella di trovare l'elemento selezionato precedente con ogni elemento nell'elenco di array e scambiare la sua posizione con il primo elemento. Ecco il codice

OnResume()
{
int before_index = ShowLastSelectedElement();
if (isFound){
      Collections.swap(yourArrayList,before_index,0);
   }
adapter = new ArrayAdapter<String>(CurrentActivity.this,
                            android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;                    yourListView.setAdapter(adapter);
}
...
private int ShowLastSelectedElement() {
        String strName = "";
        int swap_index = 0;
        for (int i=0;i<societies.size();i++){
            strName = yourArrayList.get(i);
            if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase())){
                swap_index = i;
                isFound = true;
            }
        }
        return swap_index;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.