В настоящее время вы выполняете всю настройку Spinner
в onCreate()
: вы создаете экземпляр адаптера с (возможно, пустым) списком данных и вызываете spinner.setAdapter(spinnerAdapter);
После этого вы меняете только данные list: каждый раз, когда вызывается getAllChildExercisesFromParentID(List<String>)
, вы добавляете пару String
s в список данных, который вы передали в адаптер. Но вы никогда не вызываете notifyDatasetChanged()
на адаптере, и я думаю, что именно здесь все начинает идти не так.
Среда выполнения не выдает Exception
(как это было бы в случае с ListView
вместо Spinner
, если я правильно помню) - вы просто видите пустой (!) Spinner
с непустым раскрывающимся списком, и выбор элемента не имеет никакого эффекта.
Итак, чтобы исправить вашу проблему, вы можете воссоздать новый адаптер для Spinner
при вызове getAllChildExercisesFromParentID(List<String>)
. В этом случае вам нужно сделать Spinner
полем вашего Activity
, чтобы к нему можно было получить доступ с помощью этого метода:
private Spinner spinner;
Инициализируйте его в onCreate()
, но не устанавливайте адаптер еще:
spinner = findViewById(R.id.spinner1);
spinner.setOnItemSelectedListener(this);
Создайте новый экземпляр адаптера для Spinner
, когда вы получите данные:
private void getAllChildExercisesFromParentID(List<String> allChildExercisesReceived){
// maybe removing old data is a good idea?
allChildExerciseNames.clear();
allChildExerciseNames.addAll(allChildExercisesReceived);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, allChildExerciseNames);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
}
Или вы позволите своему Activity
иметь поле private ArrayAdapter<String> spinnerAdapter;
Инициализируйте Spinner
полностью в onCreate()
:
Spinner spinner = findViewById(R.id.spinner1);
spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, allChildExerciseNames);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
spinner.setOnItemSelectedListener(this);
... и обновите список данных (и, следовательно, адаптер), когда вы получите данные:
private void getAllChildExercisesFromParentID(List<String> allChildExercisesReceived){
// remove old data
allChildExerciseNames.clear();
allChildExerciseNames.addAll(allChildExercisesReceived);
spinnerAdapter.notifyDataSetChanged();
}
Мне больше нравится вторая версия, потому что в ней не нужно создавать новый объект каждый раз при обновлении данных - это может помочь улучшить производительность (но в этом случае влияние на современные устройства будет едва заметно , так что это больше вопрос стиля кода)
Кстати, конечно, вы можете и должны сохранить Spinner
в своем макете - AppCompatSpinner
был всего лишь моей попыткой избавиться от странного "Landroid / widget / AbsListView ... ", которое только что появилось в одновременно с проблемой Spinner
.