Android: setSelection не влияет на Spinner

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

    LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View dialogView = li.inflate(R.layout.edit_event, null);
    ...
    ArrayList<String> routes = new ArrayList<String>();
    // routes filled with values at runtime
    ...
    ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, android.R.layout.simple_spinner_item, routes);
    aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);

    String dest = events.get(pos).getDestination();
    int routesPos = routes.indexOf(dest);
    Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
    destSpinner.setSelection(routesPos);

    destSpinner.setAdapter(aa);

Код работает по назначению, за исключением setSelection-part, и я просто не могу понять, почему.

XML-макет спиннера выглядит так (не весь макет, а только прядильная часть):

// DESTINATION
<TextView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Destination:" />
<Spinner
   android:id="@+id/edit_event_destination"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:prompt="@string/choose_dest"
   android:layout_marginBottom="10dip"
   android:text="" />

Помощь очень ценится!

Линус

Ответ 1

Попробуйте перевести вызов на setSelection() после вызова setAdapter().

Ответ 2

У меня была аналогичная проблема. В моем случае setAdaper и setSelection были в правильном порядке! Выполненная форма onCreate работала, но при выполнении из onResume не имела никакого эффекта.

Решение должно вызвать setSelection(my_pos, true). Обратите внимание на второй параметр.

Ответ 3

Вы можете попробовать

mSpinner.post(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  });

это выведет действие runnable для запуска, как только будет создано представление

Ответ 4

В моем случае ни один из ответов не работал, поэтому я поставил в очередь setSelection через обработчик

new Handler().postDelayed(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  }, 100);

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

Ответ 5

Решение - вызвать setSelection (my_pos, true). Обратите внимание на второй параметр.

Не забывайте, если вы вызываете анимацию, параметры настройки макета тогда:) Пример:

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);

вручную настроенные paddings, чтобы spinner нужно было сбросить вручную

Ответ 6

У меня была та же проблема, что и spinner внутри fragment : setSelection корректно работает во время onCreate при первом запуске этой операции, но не при повороте экрана. Я решил его, вызвав setSelection в методе onViewStateRestored фрагмента, а не вызвал его внутри метода onCreate. Я не уверен, но я думаю, что вы не можете использовать setSelection, пока представление не будет полностью загружено, даже если вы можете findViewById его.

Ответ 7

Ни один из предыдущих ответов не работал у меня. Однако работа создала переменную экземпляра mSpinner в методе onCreateView() моего фрагмента (или, я бы ожидал, метод onCreate() вашей деятельности), а затем выполнил это в моем onLoadFinished() метод...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

    adapter.swapCursor(cursor);
    mSpinner.setSelection(mSelectedIndex);

}

Ответ 8

Spinner.setSelection() не работают, если вы вызываете его перед Spinner.setAdapter()

Попробуйте позвонить setSelection() после вызова setAdapter().

Причина для этого: когда вы вызываете Spinner.Selection() перед установкой адаптера к нему, просто означает, что вы пытаетесь установить spinner для настраиваемого индекса с помощью setSelection(), когда он не содержит никаких данных или мы можем сказать, что spinner имеет max item = 0.

поэтому setSelection(1) означает, что индекс установки равен 1 для счетчика, который имеет max item = 0; Хотя spinner сам обрабатывает этот outofBoundIndex, поэтому ваше приложение не сработает.

вызов setSelection() должен быть после setAdapter() only

Также, если у вас есть Spinner.SetOnItemSelectedListener(), и у вас возникла проблема с тем, что onItemSelected(AdapterView<?> parent, View view, int position, long id) запустится с позиционным значением = 0 при загрузке нагрузки, а затем вы должны использовать этот шаблон.

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();

Ответ 9

попробуйте это, это сработало для меня:

Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);