Как сохранить взаимозависимые позиции счетчиков при изменении ориентации экрана - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть два взаимозависимых 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 программирование.

...