Установить выбранный элемент счетчика программно


384

Я работаю над проектом Android, и я использую счетчик, который использует адаптер массива, который заполняется из базы данных.

Я не могу узнать, как я могу установить выбранный элемент программно из списка. Например, если в блесне у меня есть следующие предметы:

  • Категория 1
  • Категория 2
  • Категория 3

Как бы программно сделать категорию 2 выбранным элементом при создании экрана. Я думал, что это может быть похоже на c # IE Spinner.SelectedText = "Категория 2", но, похоже, нет никакого метода, подобного этому для Android.


Пожалуйста, перейдите по этой ссылке: [Как установить выбор на элементе счетчика] [1] [1]: stackoverflow.com/questions/16358563/…
Мэдди

1
Вы можете передать свой индекс в spinner.setSelection(). Это будет работать просто отлично. Вы также можете создать метод, который поможет вам сопоставить ваши индексы с их фактическими строками.
Таслим Осени

Ответы:


737

Используйте следующее: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


287
Спасибо, это сработало отлично, пока я делал это, я также нашел способ получить индекс без необходимости циклически проходить через адаптер. Я использовал следующееmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

86
в случае, если у вас нет адаптера для ссылки. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()) GetPosition ( "Значение").);
Калель Уэйд

3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Гуфигхед

Вызов SetSelection () сразу после того, как setAdapter (), кажется, всегда отображает 1-й элемент (Android 2.3), даже самый хороший выбран в dropView. добавление view.post () (ответ @Marco Hernaiz Cao) исправит это для меня.
Христос

3
Это не работает, если Spinner имеет onItemSelectedListener (). Слушатель не будет вызван.
Дон Ларинкс

80

Ни один из этих ответов не дал мне решения, работал только с этим:

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

3
Я вызываю SetSelection () сразу после setAdapter (). При этом всегда отображается 1-й элемент (Android 2.3), даже самый хороший выбран в dropView. Ваше решение сделало это для меня.
Христос

2
Спасибо, что сработало! Кстати, работает и для ListView.post.run () executeItemClick ()
Майкл Д.

Как я могу выбрать последний в зависимости от размера?
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;
        }
    }
}

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

selectSpinnerItemByValue(spinnerObject, desiredValue);

и, конечно, вы также можете выбрать по индексу прямо как

spinnerObject.setSelection(index);

Ошибка с этим кодом заключается в том, что @Boardy хочет, чтобы выбор, Category 2который, как я полагаю, представлял собой строку (если он пытался его использовать Spinner.SelectedText = "Category 2"), но приведенный выше код предназначен для a long.
Арун Джордж

Он заполняет категории из базы данных, там должен быть идентификатор для каждой категории.
Якуб Ахмад

1
Почему предполагается, что это CursorAdapter? SpinnerAdapter работает так же хорошо.
Грег Эннис

Я думаю, что у вас есть ошибка, должно быть adapter.getItem(position), нет adapter.getItemId(position).
Вадим Котов

29

Некоторое объяснение (по крайней мере, для фрагментов - никогда не пробовал с чистой деятельностью). Надеюсь, это поможет кому-то лучше понять Android.

Самый популярный ответ Аруна Джорджа правильный, но в некоторых случаях не работает.
В ответе Marco HC используется Runnable, который является последним средством из-за дополнительной загрузки процессора.

Ответ таков: вы должны просто выбрать правильное место для вызова setSelection () , например, это работает для меня:

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

    yourSpinner.setSelection(pos);
 }

Но это не будет работать в onCreateView () . Я подозреваю, что это причина интереса к этой теме.

Секрет в том, что с Android вы не можете делать все, что хотите, ни в каком методе - упс :( - компоненты могут просто не быть готовы. В качестве другого примера - вы не можете прокручивать ScrollView ни в onCreateView (), ни в onResume () ( см ответ здесь )


Спасибо - я не знал, что у фрагментов был метод onResume.
ToolmakerSteve

Я мог бы дать +18, чтобы ваш ответ был выше @Marco HC's. Вы - единственный, кто пытается делать вещи так, как это должно быть сделано
вендант

15

Чтобы найти значение и выбрать его:

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

Почему бы вам не использовать ваши значения из БД и сохранить их в ArrayList, а затем просто использовать:

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

1
Различные решения, использующие DataAdapter, не работали для меня, но с помощью ArrayList, из которого были построены значения в этом примере, все получилось.
ewall

8

Оптимальное решение:

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

Чтобы получить позицию элемента автоматически добавьте следующее утверждение

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

7

Вы можете сделать общий метод для такой работы, как я делаю в своем UtilityClass, который

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

Вы можете легко установить это так: spinner.setSelection(1)вместо 1 вы можете установить любую позицию списка, которую вы хотели бы показать.


4

У меня есть SimpleCursorAdapter, поэтому я должен продублировать данные для использования respose в этом посте. Итак, я рекомендую вам попробовать этот способ:

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

Я думаю, что это настоящий путь


1
да, в случае SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) дает курсор, который можно использовать для получения столбцов.
Лалит

3

Это работа для меня.

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

а как насчет +1?
SHADOW.NET

Потому что это начало с 0, поэтому мы должны добавить один для получения правильного ответа
Арпит Патель

2

Если у вас есть список контактов, вы можете пойти на это:

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

2

Я знаю, что уже ответили, но простой код для выбора одного элемента, очень простой:

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
Не могли бы вы добавить немного текста, чтобы объяснить свой ответ?
Kmeixner

2

Об этом говорится в комментариях в других местах на этой странице, но я считаю полезным вытащить это в ответ:

При использовании адаптера, я обнаружил , что spinnerObject.setSelection(INDEX_OF_CATEGORY2)должно произойти после того, как на setAdapterвызов; в противном случае первый элемент всегда является первоначальным выбором.

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

Это подтверждается просмотром кода AbsSpinner для setAdapter.


Конечно, вы можете выбрать элемент только после того, как адаптер был заполнен.
CoolMind

2

Вот что я использую в Kotlin:

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

если indexOfне удается сопоставить, то возвращается -1, что, по-видимому, приводит к тому, что значение по умолчанию выбирается с помощью spinner.setSelection. Я в порядке с этим.
lasec0203

0

В моем случае этот код спас мой день:

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

Вам не нужно делать это. Адаптер имеет вызов getPosition (item), который возвращает позицию int.
ЦГ

0

Большую часть времени spinner.setSelection(i); //i is 0 to (size-1) of adapter's size не работает. Если вы просто позвонитеspinner.setSelection(i);

Это зависит от вашей логики.

Если представление полностью загружено, и вы хотите вызвать его из интерфейса, я предлагаю вам позвонить

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

Или, если вы хотите переключиться между жизненным циклом действия / фрагмента, позвоните так

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

0

Я сделал несколько расширений Spinnerдля загрузки данных и отслеживания выбора элементов.

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

Пример использования

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

Это сработало для меня:

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

Это похоже на решение @ sberezin, но вызывает setSelection () в onStart ().


-1

У меня была такая же проблема со вчерашнего дня. К сожалению, первый элемент в списке массивов по умолчанию отображается в виджете счетчика. Оборотным путем было бы найти предыдущий выбранный элемент с каждым элементом в списке массивов и поменять его позицию с первым элементом. Вот код

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;
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.