Stellen Sie das ausgewählte Element des Spinners programmgesteuert ein

384

Ich arbeite an einem Android-Projekt und verwende einen Spinner, der einen Array-Adapter verwendet, der aus der Datenbank gefüllt wird.

Ich kann nicht herausfinden, wie ich das ausgewählte Element programmgesteuert aus der Liste festlegen kann. Zum Beispiel, wenn ich im Spinner die folgenden Gegenstände habe:

  • Kategorie 1
  • Kategorie 2
  • Kategorie 3

Wie würde ich Kategorie 2 programmgesteuert zum ausgewählten Element machen, wenn der Bildschirm erstellt wird? Ich dachte, es könnte ähnlich sein wie c # IE Spinner.SelectedText = "Kategorie 2", aber es scheint keine ähnliche Methode für Android zu geben.

Boardy
quelle
Bitte folgen Sie diesem Link: [So stellen Sie die Auswahl für das Spinner-Element ein] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy
1
Sie können Ihren Index an übergeben spinner.setSelection(). Das würde gut funktionieren. Sie können auch eine Methode erstellen, mit der Sie Ihre Indizes an die tatsächlichen Zeichenfolgen anpassen können.
Taslim Oseni

Antworten:

737

Verwenden Sie Folgendes : spinnerObject.setSelection(INDEX_OF_CATEGORY2).

Arun George
quelle
286
Vielen Dank, das hat super funktioniert. Während ich das tat, habe ich auch einen Weg gefunden, den Index zu erhalten, ohne den Adapter durchlaufen zu müssen. Ich habe folgendes benutztmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy
86
falls Sie den Adapter nicht als Referenz haben. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Value"));
Kalel Wade
3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead
Wenn Sie SetSelection () direkt nach setAdapter () aufrufen, wird immer das erste Element angezeigt (Android 2.3), auch das gute wird in der dropView ausgewählt. Das Hinzufügen von view.post () (@ Marco Hernaiz Cao Antwort) behebt das Problem für mich.
Christus
3
Dies funktioniert nicht, wenn der Spinner über einen onItemSelectedListener () verfügt. Der Listener wird nicht angerufen.
Don Larynx
80

Keine dieser Antworten gab mir die Lösung, arbeitete nur damit:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
Marco HC
quelle
3
Ich rufe SetSelection () direkt nach setAdapter () auf. Dies zeigt immer das 1. Element an (Android 2.3), auch das gute wird in der dropView ausgewählt. Ihre Lösung hat es für mich getan.
Christus
2
Danke, das hat funktioniert! Übrigens funktioniert auch für ListView.post.run () performItemClick ()
Michael D.
Wie kann ich den letzten anhand der Größe auswählen?
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;
        }
    }
}

Sie können die oben genannten wie folgt verwenden:

selectSpinnerItemByValue(spinnerObject, desiredValue);

& natürlich kannst du auch per index direkt wie auswählen

spinnerObject.setSelection(index);
Yaqub Ahmad
quelle
Ein Fehler bei diesem Code ist, dass @Boardy möchte, dass die Auswahl, von Category 2der ich annehme, ein String ist (vorausgesetzt, er hat es versucht Spinner.SelectedText = "Category 2"), aber der obige Code ist für a long.
Arun George
Er füllt die Kategorien aus der Datenbank aus. Für jede Kategorie muss eine ID vorhanden sein.
Yaqub Ahmad
1
Warum sollte man annehmen, dass es sich um einen CursorAdapter handelt? SpinnerAdapter funktioniert genauso gut.
Greg Ennis
Ich denke, Sie haben hier einen Fehler, sollte es adapter.getItem(position)nicht sein adapter.getItemId(position).
Vadim Kotov
29

Einige Erklärungen (zumindest für Fragmente - nie mit reiner Aktivität versucht). Hoffe, es hilft jemandem, Android besser zu verstehen.

Die beliebteste Antwort von Arun George ist richtig, funktioniert aber in einigen Fällen nicht.
Die Antwort von Marco HC verwendet Runnable, was aufgrund der zusätzlichen CPU-Auslastung ein letzter Ausweg ist.

Die Antwort ist - man sollte einfach richtige Stelle wählen , um setSelection () aufrufen , zum Beispiel es funktioniert für mich:

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

    yourSpinner.setSelection(pos);
 }

In onCreateView () funktioniert dies jedoch nicht . Ich vermute, das ist der Grund für das Interesse an diesem Thema.

Das Geheimnis ist, dass Sie mit Android in keiner Methode alles tun können, was Sie wollen - oops :( - Komponenten sind möglicherweise nicht bereit. Als weiteres Beispiel können Sie ScrollView weder in onCreateView () noch in onResume () () scrollen siehe die Antwort hier )

sberezin
quelle
Danke - ich wusste nicht, dass Fragmente die onResume-Methode haben.
ToolmakerSteve
Ich werde ich könnte +18 geben, damit Ihre Antwort über @Marco HCs liegt. Sie sind der einzige, der versucht, die Dinge so zu machen, wie sie gemacht werden sollen
vedant
15

So finden Sie einen Wert und wählen ihn aus:

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;
        }
    }
}
Ferran Maylinch
quelle
12

Warum verwenden Sie nicht Ihre Werte aus der Datenbank und speichern sie in einer ArrayList und verwenden dann einfach:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
RicardoSousaDev
quelle
1
Die verschiedenen Lösungen mit dem DataAdapter haben bei mir nicht funktioniert, aber die Verwendung der ArrayList, aus der die Werte in diesem Beispiel erstellt wurden, hat den Trick getan.
Ewall
8

Die optimale Lösung ist:

    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);

Um die Position des Elements zu ermitteln, fügen Sie automatisch die folgende Anweisung hinzu

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
Naham Al-Zuhairi
quelle
7

Sie können eine generische Methode für diese Art von Arbeit erstellen, wie ich es in meiner UtilityClass tue

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);
        }
    }
}
ZygoteInit
quelle
5

Sie können dies einfach so einstellen: spinner.setSelection(1)Anstelle von 1 können Sie eine beliebige Position der Liste festlegen, die Sie anzeigen möchten.

Vadim Kotov
quelle
4

Ich habe einen SimpleCursorAdapter, daher muss ich die Daten duplizieren, um die Antwort in diesem Beitrag zu verwenden. Ich empfehle Ihnen daher, Folgendes zu versuchen:

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;
    }
}

Ich denke das ist ein echter Weg

pazfernando
quelle
1
Ja, im Fall von SimpleCursorAdapter gibt spinnerRegion.getItemIdAtPosition (i) einen Cursor an, mit dem die Spalten abgerufen werden können.
Lalitm
3

Das ist Arbeit für mich.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
Arpit Patel
quelle
was ist mit der +1?
SHADOW.NET
Weil es bei 0 beginnt, müssen wir eine hinzufügen, um die richtige Antwort zu erhalten
Arpit Patel
2

Wenn Sie eine Kontaktliste haben, können Sie dies tun:

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

Ich weiß, dass das bereits beantwortet wurde, aber einfacher Code zum Auswählen eines Elements, sehr einfach:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
Dante
quelle
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
Julio Cezar Riffel
quelle
4
Könnten Sie ein wenig Text hinzufügen, um Ihre Antwort zu erklären?
Kmeixner
2

Dies wird in den Kommentaren an anderer Stelle auf dieser Seite angegeben, hielt es jedoch für nützlich, eine Antwort daraus zu ziehen:

Bei Verwendung eines Adapters habe ich festgestellt, dass die spinnerObject.setSelection(INDEX_OF_CATEGORY2)Anforderungen nach dem setAdapterAufruf auftreten müssen. Andernfalls ist das erste Element immer die anfängliche Auswahl.

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

Dies wird durch Überprüfen des AbsSpinner- Codes für bestätigt setAdapter.

Andy
quelle
Natürlich können Sie einen Artikel erst auswählen, nachdem der Adapter gefüllt wurde.
CoolMind
2

Folgendes verwende ich in Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
Donny Rozendal
quelle
Wenn indexOfkeine Übereinstimmung hergestellt werden kann, wird zurückgegeben -1, was anscheinend dazu führt, dass der Standardwert von ausgewählt wird spinner.setSelection. Das ist ok für mich.
lasec0203
0

In meinem Fall hat dieser Code meinen Tag gerettet:

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;
        }
    }
}
Juan Pablo
quelle
Sie müssen dies nicht tun. Der Adapter hat einen Aufruf von getPosition (item), der die int-Position zurückgibt.
tzg
0

Meistens spinner.setSelection(i); //i is 0 to (size-1) of adapter's size funktioniert es nicht. Wenn Sie nur anrufenspinner.setSelection(i);

Es hängt von Ihrer Logik ab.

Wenn die Ansicht vollständig geladen ist und Sie sie über die Benutzeroberfläche aufrufen möchten, empfehlen wir Ihnen, sie aufzurufen

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

Oder rufen Sie wie folgt auf, wenn Sie zwischen Aktivität / Fragmentlebenszyklus wechseln möchten

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

Ich hatte eine Erweiterungsfunktion Spinnerzum Laden von Daten und Verfolgen der Artikelauswahl erstellt.

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)
        }
    }
}

Verwendungsbeispiel

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
}
Sagar Chapagain
quelle
-1

Das hat bei mir funktioniert:

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

Es ähnelt der Lösung von @ sberezin, ruft jedoch setSelection () in onStart () auf.

JosinMC
quelle
-1

Ich hatte das gleiche Problem seit gestern. Leider wird das erste Element in der Array-Liste standardmäßig im Spinner-Widget angezeigt. Eine Trendwende besteht darin, das zuvor ausgewählte Element mit jedem Element in der Array-Liste zu finden und seine Position mit dem ersten Element zu tauschen. Hier ist der Code.

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;
    }
Vikhyat Chandra
quelle