Встановити вибраний елемент спінера програмно


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


285
Дякую, це спрацювало чудово, в той час як я робив це, я також знайшов спосіб отримання індексу, не потребуючи перебирати через адаптер. Я використав наступнеmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

85
якщо у вас немає адаптера для посилання. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Значення"));
Калель Вейд

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

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

3
Це не працює, якщо в Spinner є onItemSelectedListener (). Слухач не буде викликаний.
Дон Ларинкс

79

Ніхто з цих відповідей не дав мені рішення, тільки працював з цим:

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

3
Я викликаю SetSelection () відразу після setAdapter (). Це відображає 1-й елемент завжди (Android 2.3), навіть хороший обраний у dropView. Ваше рішення зробило це для мене.
Христос

2
Дякую, що спрацювало! btw працює і для ListView.post.run () performItemClick (), а також
Michael D.

Як я можу вибрати останній залежно від розміру?
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який я вважаю, був String (якщо припустити, що він намагався використовувати Spinner.SelectedText = "Category 2"), але наведений вище код призначений для 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 ви не можете робити нічого, що хочете, у будь-якому методі - oops :( - компоненти можуть просто не бути готовими. Як інший приклад - ви не можете прокручувати ScrollView ні в onCreateView (), ні в onResume () дивіться відповідь тут )


Дякую - я не знав, що у фрагментах був метод onResume.
ToolmakerSteve

Я можу, я можу дати +18, щоб ваша відповідь була вище, ніж @Marco HC. Ви єдиний, хто намагається робити речі так, як це передбачається зробити
продавець

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, тому мені доведеться дублювати дані, щоб використовувати відповідь у цій публікації. Тож рекомендую спробувати так:

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, тому ми мусимо додати одну для отримання правильної відповіді
Arpit Patel

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

Про це йдеться в коментарях в інших місцях на цій сторінці, але вважається корисним зрозуміти це як відповідь:

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

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

Це підтверджується переглядом AbsSpinner коду для setAdapter.


Звичайно, ви можете вибрати предмет лише після заповнення адаптера.
CoolMind

2

Це те, що я використовую в Котліні:

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

У мене була та сама проблема з вчорашнього дня. На жаль, перший елемент у списку масиву за замовчуванням відображається у віджеті spinner. Поворот повинен був знайти попередній вибраний елемент із кожним елементом у списку масиву та поміняти його положенням першим елементом. Ось код.

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.