Android: изменение видимости ProgressBar не работает - PullRequest
0 голосов
/ 28 мая 2020

У меня есть ProgressBar в моем макете с использованием привязки данных:

        <ProgressBar
            android:id="@+id/pb_loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/sov_avatar"
            app:layout_constraintVertical_bias="0.32999998"
            app:ui_state_loading="@{viewModel.UIState}"/>

Адаптер привязки выглядит следующим образом:

@BindingAdapter("ui_state_loading")
internal fun setUIStateForLoadingContent(view: View, repositoryResult: RepositoryResult<*>) {
Timber.tag("PROGRESS_BAR").d("binding adapter thread: ${Thread.currentThread().name}")

view.visibility = when (repositoryResult) {
    is RepositoryResult.Loading -> View.VISIBLE
    else -> View.INVISIBLE
}

}

Класс привязки создано так:

        _binding = FragmentRoutesBinding.inflate(layoutInflater, container, false).apply {
        lifecycleOwner = this@RoutesFragment
        viewModel = mViewModel

UIState - это LiveData, созданная в моей модели ViewModel:

    private val _UIState: MutableLiveData<RepositoryResult<CityData>> by lazy {
    MutableLiveData<RepositoryResult<CityData>>().also {
        it.value = RepositoryResult.Loading()
        viewModelScope.launch {
            val repositoryResult = withContext(Dispatchers.IO) {
                mRepository.getCityData().run {
                    val cityData = this.data!!
                    routesFromJson = cityData.routes
                    poisFromJson = cityData.pointsOfInterest

                    // Code to get all the pois to copy in SearchSuggestionsContentProvider
                    /*val depoList = poisFromJson
                    var pois: String = ""
                    depoList?.forEach {
                        pois += "\"${it.name}\","
                    }
                    Timber.d(pois)*/

                    this
                }
            }

            it.value = repositoryResult
        }
    }

}

override val UIState: LiveData<RepositoryResult<CityData>> = _UIState

Теперь, отлаживая мое приложение, я вижу, что метод адаптера привязки правильно вызывается 2 раза (оба в основном потоке), и охватываются 2 варианта (сначала видимые, затем невидимые, с промежутком в несколько сотен миллисекунд между ними), но ProgressBar остается видимым на экране. Я попытался заменить ProgressBar на ImageView, но проблема осталась. Не знаю, в чем причина. Может быть, я слишком быстро меняю видимость?

ОБНОВЛЕНИЕ Я пробовал с TextView: изменение текста работает, изменение видимости нет ...

UPDATE2 Я решил проблему с изменением альфа-значения View. Однако я не знаю, почему не работает изменение свойства видимости.

1 Ответ

0 голосов
/ 28 мая 2020

Используйте View.GONE вместо View.INVISIBLE.

...