Упростите ViewState, удалив состояние перезагрузки и просто используя состояние загрузки

#android #android-binding-adapter

#Android #android-привязка-адаптер

Вопрос:

Я не хочу скрывать RecyclerView при обновлении с помощью SwipeRefreshLayout. В результате я ввел состояние перезагрузки в свой класс ViewState :

 sealed class Resource<out T> {
    class Loading<out T> : Resource<T>()
    class Reloading<out T> : Resource<T>()
    data class Success<out T>(val data: T?) : Resource<T>()
    data class Failure<out T>(val cause: String?) : Resource<T>()
}
 

И вот мои адаптеры привязки :

     @JvmStatic
    @BindingAdapter("refreshing")
    fun setSwipeRefreshLayout(view: SwipeRefreshLayout, resource: Resource<*>?) {
        view.isRefreshing = resource is Resource.Loading || resource is Resource.Reloading
        view.isEnabled = resource !is Resource.Failure
    }

    @JvmStatic
    @BindingAdapter("showError")
    fun showError(view: View, resource: Resource<*>?) {
        view.visibility = if (resource is Resource.Failure) View.VISIBLE else View.GONE
    }

    @JvmStatic
    @BindingAdapter("showData")
    fun showData(view: RecyclerView, resource: Resource<*>?) {
        view.visibility = if (resource is Resource.Reloading || resource is Resource.Success)
            View.VISIBLE else View.GONE

    }
 

Есть ли какое-либо решение для упрощения классов ViewState и удаления состояния перезагрузки (просто используя состояние загрузки)?
Исходный код можно найти здесь: https://github.com/AliRezaeiii/SavingGoals-Cache

Комментарии:

1. Я не знаком с адаптером Biding, но, на мой взгляд, вы можете заменить class Loading его на data class Loading(val isRefreshing: Boolean) .

Ответ №1:

Самый простой способ отключить Reloading state и добавить логический индикатор в Loading state :

 sealed class Resource<out T> {
    data class Loading<out T>(val isRefreshing: Boolean) : Resource<T>()
    data class Success<out T>(val data: T?) : Resource<T>()
    data class Failure<out T>(val cause: String?) : Resource<T>()
}