setVisibility() не обновляет макет активности

Я устанавливаю видимость кнопки как VISIBLE или GONE при выборе элемента счетчика:-

selectUserTypeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                FilterUserType newUserType = FilterUserType.get(position);
                if(filter.userType != newUserType){
                    filter.userType = newUserType;
                    ScrollView mainScrollView =  (ScrollView) findViewById(R.id.mainLayout);
                    switch (newUserType) {
                    case AnyUser:
                    case CurrentUser:{
                        selectUserBtn.setVisibility(View.GONE);
                        break;
                    }
                    case SpecificUser:{
                        selectUserBtn.setVisibility(View.VISIBLE);
                        break;
                    }
                    default:
                        break;
                    }
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {}

        });

Здесь проблема в том, что мое представление не обновляется после этого действия, но когда я выбираю один EditText на странице и клавиатура работает.. в это время он обновляется и показывает желаемое поведение.

Я пробовал редактировать switch-case как:

switch (newUserType) {
    case AnyUser:
    case CurrentUser:{
        selectUserBtn.setVisibility(View.GONE);
        mainScrollView.invalidate();
        break;
    }
    case SpecificUser:{
        selectUserBtn.setVisibility(View.VISIBLE);
        mainScrollView.invalidate();
        break;
    }
    default:
        break;
    }
}

Но это тоже не работает

К вашему сведению, я использую HoloEverywhere тема в моем проекте, и этот счетчик из виджетов HoloEverywhere.

2 ответа

Решение

У меня такая же проблема. Класс spinner из holoeverywhere обновляет свою графику после вызова onItemSelected. Так что это "переопределяет" ваше обновление макета. Единственное решение, которое я нашел, было установить обработчик для обновления пользовательского интерфейса, который будет исполнен через 1 секунду в будущем. Как это:

Handler han = new Handler();
        han.postAtTime(new Runnable() {
            @Override
            public void run() {
                // UPDATE UI HERE
            }
        }, 1000);

Самое простое решение anno 2022 — использовать следующий метод:

      runOnUiThread(() -> mBoatSelectMenu.setVisibility(View.VISIBLE));

Где mBoatSelectMenu указанный идентификатор XML относится к выбранному элементу.

Другие вопросы по тегам