Ответ 1
Попробуйте перевести вызов на setSelection()
после вызова setAdapter()
.
У меня проблема с 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="" />
Помощь очень ценится!
Линус
Попробуйте перевести вызов на setSelection()
после вызова setAdapter()
.
У меня была аналогичная проблема. В моем случае setAdaper
и setSelection
были в правильном порядке! Выполненная форма onCreate
работала, но при выполнении из onResume
не имела никакого эффекта.
Решение должно вызвать setSelection(my_pos, true)
. Обратите внимание на второй параметр.
Вы можете попробовать
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
это выведет действие runnable для запуска, как только будет создано представление
В моем случае ни один из ответов не работал, поэтому я поставил в очередь setSelection через обработчик
new Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
Это может привести к проблемам при работе на медленных устройствах, но я работаю над конкретным устройством, поэтому можно использовать этот хак
Решение - вызвать setSelection (my_pos, true). Обратите внимание на второй параметр.
Не забывайте, если вы вызываете анимацию, параметры настройки макета тогда:) Пример:
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
вручную настроенные paddings, чтобы spinner нужно было сбросить вручную
У меня была та же проблема, что и spinner внутри fragment : setSelection
корректно работает во время onCreate
при первом запуске этой операции, но не при повороте экрана. Я решил его, вызвав setSelection
в методе onViewStateRestored
фрагмента, а не вызвал его внутри метода onCreate
. Я не уверен, но я думаю, что вы не можете использовать setSelection
, пока представление не будет полностью загружено, даже если вы можете findViewById
его.
Ни один из предыдущих ответов не работал у меня. Однако работа создала переменную экземпляра mSpinner
в методе onCreateView()
моего фрагмента (или, я бы ожидал, метод onCreate() вашей деятельности), а затем выполнил это в моем onLoadFinished()
метод...
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
mSpinner.setSelection(mSelectedIndex);
}
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();
попробуйте это, это сработало для меня:
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);