Как установить выбранный элемент Spinner по значению, а не по положению? - PullRequest
274 голосов
/ 06 марта 2010

У меня есть представление обновления, где мне нужно предварительно выбрать значение, хранящееся в базе данных для Spinner.

Я имел в виду нечто подобное, но у Adapter нет метода indexOfтак что я застрял.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}

Ответы [ 24 ]

606 голосов
/ 19 ноября 2010

Предположим, что ваш Spinner назван mSpinner, и он содержит один из вариантов: "некоторое значение".

Чтобы найти и сравнить положение «некоторого значения» в Spinner, используйте это:

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}
128 голосов
/ 01 февраля 2013

Простой способ установить счетчик на основе значения -

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 

Путь к сложному коду уже есть, это гораздо проще.

34 голосов
/ 06 марта 2010

Я держу отдельный ArrayList всех предметов в моих Spinners.Таким образом, я могу сделать indexOf для ArrayList и затем использовать это значение, чтобы установить выбор в Spinner.

28 голосов
/ 23 августа 2012

Основываясь на ответе Merrill , я придумал это однострочное решение ... оно не очень красивое, но вы можете обвинить любого, кто поддерживает код для Spinner, за то, что он пренебрегает включением функции, которая делает это для этого.

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

Вы получите предупреждение о том, что приведение к ArrayAdapter<String> не проверено ... на самом деле, вы можете просто использовать ArrayAdapter, как это сделал Меррилл, но это только заменяет одно предупреждение на другое.

10 голосов
/ 18 марта 2015

, если вы используете строковый массив, это лучший способ:

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);
8 голосов
/ 17 октября 2013

Вы также можете использовать это,

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
8 голосов
/ 30 августа 2012

Если вам нужен метод indexOf на любом старом адаптере (и вы не знаете базовую реализацию), тогда вы можете использовать это:

private int indexOf(final Adapter adapter, Object value)
{
    for (int index = 0, count = adapter.getCount(); index < count; ++index)
    {
        if (adapter.getItem(index).equals(value))
        {
            return index;
        }
    }
    return -1;
}
7 голосов
/ 26 июля 2012

На основании ответа Merrill вот как это сделать с помощью CursorAdapter

CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }
5 голосов
/ 18 декабря 2016

Используйте следующую строку для выбора значения:

mSpinner.setSelection(yourList.indexOf("value"));
3 голосов
/ 19 октября 2016

Это мой простой способ получить индекс по строке.

private int getIndexByString(Spinner spinner, String string) {
    int index = 0;

    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) {
            index = i;
            break;
        }
    }
    return index;
}
...