Ustaw wybrany element pokrętła programowo


384

Pracuję nad projektem Androida i używam tarczy, która korzysta z adaptera tablicy zapełnianego z bazy danych.

Nie mogę dowiedzieć się, jak mogę programowo ustawić wybrany element z listy. Na przykład, jeśli w przędzarce mam następujące elementy:

  • Kategoria 1
  • Kategoria 2
  • Kategoria 3

W jaki sposób programowo uczynię kategorię 2 wybranym elementem podczas tworzenia ekranu. Myślałem, że może być podobny do c # IE Spinner.SelectedText = "Kategoria 2", ale wydaje się, że nie ma metody podobnej do tej dla Androida.


Proszę skorzystać z tego linku: [Jak ustawić wybór elementu spinnera] [1] [1]: stackoverflow.com/questions/16358563/...
Maddy

1
Możesz przekazać swój indeks do spinner.setSelection(). To by działało dobrze. Możesz także utworzyć metodę, która pomoże ci dopasować indeksy do ich rzeczywistych ciągów.
Taslim Oseni

Odpowiedzi:


736

Użyj następujących: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


285
Dzięki, działało to świetnie, podczas gdy ja to robiłem, znalazłem sposób na uzyskanie indeksu bez potrzeby przechodzenia przez adapter. Użyłem następującychmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

85
jeśli nie masz adaptera do odniesienia. mySpinner.setSelection ((((ArrayAdapter) mySpinner.getAdapter ()). getPosition („Value”));
Kalel Wade

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

wywołanie SetSelection () zaraz po tym, jak setAdapter () wydaje się zawsze wyświetlać pierwszy element (Android 2.3), nawet ten dobry jest wybrany w dropView. dodanie view.post () (odpowiedź @Marco Hernaiz Cao) napraw to dla mnie.
Chrystus,

3
To nie działa, jeśli Spinner ma onItemSelectedListener (). Słuchacz nie zostanie wywołany.
Don Larynx

79

Żadna z tych odpowiedzi nie dała mi rozwiązania, tylko działała z tym:

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

3
Wywołuję SetSelection () zaraz po setAdapter (). Wyświetla zawsze pierwszy element (Android 2.3), nawet dobry jest wybrany w dropView. Twoje rozwiązanie to dla mnie zrobiło.
Chrystus,

2
Dzięki, działało! btw działa również dla ListView.post.run () performItemClick () również
Michael D.

Jak mogę wybrać ostatni na podstawie rozmiaru?
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;
        }
    }
}

Możesz użyć powyższych, takich jak:

selectSpinnerItemByValue(spinnerObject, desiredValue);

i oczywiście możesz również wybrać według indeksu bezpośrednio jak

spinnerObject.setSelection(index);

Błąd z tym kodem polega na tym, że @Boardy chce, aby wybór, Category 2który, jak sądzę, był Ciągiem (zakładając, że próbował użyć Spinner.SelectedText = "Category 2"), ale powyższy kod dotyczy long.
Arun George,

Wypełnia kategorie z bazy danych, dla każdej kategorii musi istnieć identyfikator.
Yaqub Ahmad

1
Po co zakładać, że jest to CursorAdapter? SpinnerAdapter działa równie dobrze.
Greg Ennis,

Myślę, że masz tu błąd, powinno być adapter.getItem(position), nie adapter.getItemId(position).
Vadim Kotov

29

Pewne wyjaśnienie (przynajmniej dla Fragmentów - nigdy nie próbowano z czystą Aktywnością). Mam nadzieję, że pomoże to komuś lepiej zrozumieć Androida.

Najpopularniejsza odpowiedź Arun George jest poprawna, ale w niektórych przypadkach nie działa.
Odpowiedź Marco HC używa Runnable, który jest ostatecznością ze względu na dodatkowe obciążenie procesora.

Odpowiedź brzmi - powinieneś po prostu wybrać odpowiednie miejsce do wywołania setSelection () , na przykład to działa dla mnie:

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

    yourSpinner.setSelection(pos);
 }

Ale to nie zadziała w onCreateView () . Podejrzewam, że to jest powód zainteresowania tym tematem.

Sekret polega na tym, że w Androidzie nie możesz zrobić nic, co chcesz w żadnej metodzie - oops :( - składniki mogą po prostu nie być gotowe. Jako kolejny przykład - nie można przewijać ScrollView ani w onCreateView (), ani w onResume () ( zobacz odpowiedź tutaj )


Dzięki - nie wiedziałem, że Fragmenty mają metodę onResume.
ToolmakerSteve

Mogę dać +18, aby twoja odpowiedź była powyżej @Marco HC. Jesteś jedynym, który próbuje robić rzeczy tak, jak to ma być zrobione
wedant

15

Aby znaleźć wartość i wybrać ją:

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

Dlaczego nie użyjesz swoich wartości z bazy danych i nie zapiszesz ich na ArrayList, a następnie po prostu użyjesz:

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

1
Różne rozwiązania wykorzystujące DataAdapter nie działały dla mnie, ale załatwienie przy użyciu ArrayList, z których zbudowano wartości w tym przykładzie, załatwiło sprawę.
ewall

8

Optymalne rozwiązanie to:

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

Aby uzyskać pozycję elementu, dodaj automatycznie następujące oświadczenie

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

7

Możesz stworzyć ogólną metodę dla tego rodzaju pracy, tak jak ja w mojej UtilityClass, która jest

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

Możesz łatwo ustawić w ten sposób: spinner.setSelection(1)zamiast 1 możesz ustawić dowolną pozycję listy, którą chcesz wyświetlić.


4

Mam SimpleCursorAdapter, więc muszę zduplikować dane, aby użyć respose w tym poście. Polecam więc spróbować w ten sposób:

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

Myślę, że to prawdziwy sposób


1
tak, w przypadku SimpleCursorAdapter spinnerRegion.getItemIdAtPosition (i) daje kursor, którego można użyć do uzyskania kolumn.
lalitm

3

To dla mnie praca.

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

co z +1?
SHADOW.NET,

Ponieważ zaczyna się od 0, więc musimy dodać jedną, aby uzyskać właściwą odpowiedź
Arpit Patel

2

Jeśli masz listę kontaktów, możesz to zrobić:

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

2

Wiem, że już na nie odpowiedziano, ale prosty kod, aby wybrać jeden element, bardzo prosty:

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
Czy możesz dodać trochę tekstu, aby wyjaśnić swoją odpowiedź?
Kmeixner

2

Jest to stwierdzone w komentarzach w innych miejscach na tej stronie, ale uważam, że warto wyciągnąć je w odpowiedzi:

W przypadku korzystania z zasilacza, znalazłem, że spinnerObject.setSelection(INDEX_OF_CATEGORY2)potrzeby występować po tej setAdapterrozmowy; w przeciwnym razie pierwszym elementem jest zawsze wybór początkowy.

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

Potwierdza to przejrzenie kodu AbsSpinner dla setAdapter.


Oczywiście możesz wybrać element dopiero po napełnieniu adaptera.
CoolMind

2

Oto, czego używam w Kotlinie:

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

jeśli indexOfnie można dopasować, wówczas zwraca -1, co wydaje się skutkować wybraną wartością domyślną spinner.setSelection. Nie przeszkadza mi to.
lasec0203,

0

W moim przypadku ten kod uratował mi dzień:

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

Nie musisz tego robić. adapter ma wywołanie getPosition (item), które zwraca pozycję int.
tzg

0

Większość czasu spinner.setSelection(i); //i is 0 to (size-1) of adapter's size nie działa. Jeśli tylko zadzwoniszspinner.setSelection(i);

To zależy od twojej logiki.

Jeśli widok jest w pełni załadowany i chcesz wywołać go z interfejsu, sugeruję zadzwonić

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

Lub jeśli chcesz przełączać się między cyklem życia aktywności / fragmentu, zadzwoń w ten sposób

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

0

Zrobiłem funkcję rozszerzenia Spinnerdo ładowania danych i śledzenia wyboru elementu.

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

Przykład użycia

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

To działało dla mnie:

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

Jest podobny do rozwiązania @ sberezin, ale wywołuje setSelection () w onStart ().


-1

Miałem ten sam problem od wczoraj. Niestety pierwszy element na liście tablic jest domyślnie wyświetlany w widżecie przędzarki. Odwróceniem byłoby znalezienie poprzednio wybranego elementu z każdym elementem na liście tablic i zamiana jego pozycji z pierwszym elementem. Oto kod.

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;
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.