У меня есть два взаимозависимых Spinner
s: spinnerDepartment и spinnerSubCategory .
spinnerDepartment определяет, какой string-array
используется для заполнения spinnerSubCategory .
Мне удалось сохранить обе позиции счетчика в onSaveInstanceState
, но метод setSelection
для spinnerSubCategory должен вызываться после setAdapter
.
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
spinnerDepartment.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.i(TAG, "onItemSelected: Itemposition is "+parent.getSelectedItemPosition()+", position is: "+position);
if (position > 0) {
spinnerSubCategory.setEnabled(true);
loadSubCategorySpinner(position);
} else {
spinnerSubCategory.setEnabled(false);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
outState.putInt("spinnerdep", spinnerDepartment.getSelectedItemPosition());
outState.putInt("spinnersub", spinnerSubCategory.getSelectedItemPosition());
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
int spinnerDepartmentPosition = savedInstanceState.getInt("spinnerdep");
int spinnerSubCategoryPosition = savedInstanceState.getInt("spinnersub");
// setSelection must be called after setAdapter
spinnerSubCategory.setSelection(spinnerSubCategoryPosition);
}
}
private void loadSubCategorySpinner(int depPosition) {
List<String> subCategoryList = new ArrayList<>();
switch (depPosition) {
case 1:
subCategoryList.add("Select an option");
subCategoryList.add("bean");
subCategoryList.add("rice");
break;
case 2:
subCategoryList.add("Select an option");
subCategoryList.add("gasoline");
subCategoryList.add("ethanol");
subCategoryList.add("diesel");
break;
}
ArrayAdapter<String> subCategoryAdapter = new ArrayAdapter<String>(getContext(), R.layout.support_simple_spinner_dropdown_item, subCategoryList);
subCategoryAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinnerSubCategory.setAdapter(subCategoryAdapter);
spinnerSubCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// TODO
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
Как видите, это всего лишь логический c вопрос программирования, но для его решения требуется слишком много времени.
Я сделал spinnerSubCategoryPosition глобальная переменная и поместила условие чуть ниже setAdapter
, но когда я изменяю spinnerDepartment , новый выбор не устанавливается на Select an option
, вместо этого мы видим положение, сохраненное в spinnerSubCategoryPosition .
if (spinnerSubCategoryPosition != 0) {
spinnerSubCategory.setSelection(spinnerSubCategoryPosition);
//spinnerSubCategoryPosition = 0;
}
Я ценю, если кто-нибудь сможет исправить мою логи c программирование.