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.