Ответ 1
Используйте следующее:
spinnerObject.setSelection(INDEX_OF_CATEGORY2)
.
Я работаю над проектом android, и я использую spinner, который использует адаптер массива, который заполняется из базы данных.
Я не могу узнать, как я могу выбрать выбранный элемент программно из списка. Например, если в spinner у меня есть следующие элементы:
Как бы программно сделать Категория 2 выбранным элементом при создании экрана. Я думал, что это может быть похоже на С# I.E Spinner.SelectedText = "Категория 2", но похоже, что для Android не существует подобного метода.
Используйте следующее:
spinnerObject.setSelection(INDEX_OF_CATEGORY2)
.
Ни один из этих ответов не дал мне решения, работал только с этим:
mySpinner.post(new Runnable() {
@Override
public void run() {
mySpinner.setSelection(position);
}
});
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);
Некоторое объяснение (по крайней мере для фрагментов - никогда не использовалось с чистой Деятельностью). Надеюсь, что это поможет кому-то лучше понять Android.
Самый популярный ответ Arun George правильный, но в некоторых случаях он не работает.
Ответ от Marco HC использует Runnable, который является последним средством из-за дополнительной загрузки процессора.
Ответ: вы должны просто выбрать правильное место для вызова setSelection(), например, работает для меня:
@Override
public void onResume() {
super.onResume();
yourSpinner.setSelection(pos);
}
Но он не будет работать в onCreateView(). Я подозреваю, что это является причиной интереса к этой теме.
Секрет в том, что с Android вы не можете ничего делать в любом методе - oops:( - компоненты могут быть просто не готовы. В качестве другого примера - вы не можете прокручивать ScrollView ни в onCreateView(), ни в onResume() см. ответ здесь)
Почему бы вам не использовать свои значения из БД и не хранить их в ArrayList, а затем просто использовать:
yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
Чтобы найти значение и выбрать его:
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;
}
}
}
Вы можете создать общий метод для такого рода работы, как в моем 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);
}
}
}
оптимальное решение:
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"));
У меня есть 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;
}
}
Я думаю, что это реальный способ
Это работа для меня.
spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
Вы можете легко установить так: spinner.setSelection(1), вместо 1, вы можете установить любую позицию списка, которую вы хотели бы показать.
Если у вас есть список контактов, вы можете пойти на это:
((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
Я знаю, что уже ответили, но простой код, чтобы выбрать один элемент, очень просто:
spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
spRaca.setSelection(x);
break;
}
}
Об этом говорится в комментариях в других местах на этой странице, но я считаю полезным вытащить это в ответ:
При использовании адаптера я обнаружил, что spinnerObject.setSelection(INDEX_OF_CATEGORY2)
должен произойти после вызова setAdapter
; в противном случае первый элемент всегда является первоначальным выбором.
// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);
Это подтверждается просмотром кода setAdapter
для setAdapter
.
В моем случае этот код сохранил мой день:
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;
}
}
}
Большую часть времени spinner.setSelection(i);//i is 0 to (size-1) of adapter size
spinner.setSelection(i);//i is 0 to (size-1) of adapter 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);
}
});
Вот что я использую в Kotlin:
spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
Я сделал несколько расширений 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)
Это сработало для меня:
@Override
protected void onStart() {
super.onStart();
mySpinner.setSelection(position);
}
Он похож на решение @sberezin, но вызывает setSelection() в onStart().
У меня была такая же проблема со вчерашнего дня. К сожалению, первый элемент в списке массивов по умолчанию отображается в виджете счетчика. Оборотным путем было бы найти предыдущий выбранный элемент с каждым элементом в списке массивов и поменять его позицию с первым элементом. Вот код
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;
}