Изначально Android Recycle View всегда пуст - PullRequest
1 голос
/ 03 ноября 2019

У меня есть такая модель представления -

private val viewState = SchoolsViewState()

    fun onViewOpened() =
        Transformations.map(schoolUseCase.performAction(SchoolAction.GetList)) {
            when (it) {
                is SchoolResult.Loading -> viewState.copy(loading = true)
                is SchoolResult.ListContent -> viewState.copy(loading = false, listData = it.schoolList)
                is SchoolResult.Error -> viewState.copy(loading = false, error = it.error)
                else -> viewState.copy(loading = false)
            }
        }

Класс viewState выглядит следующим образом -

data class SchoolsViewState(
    val loading: Boolean = false,
    val schoolList: List<SchoolModel> = emptyList(),
    val error: SchoolResult.ErrorType? = null
)

Модель наблюдения фрагмента, код наблюдения, выглядит следующим образом -

viewModel.onViewOpened().observe(this, Observer {
//Handling the SchoolsViewState here
            swipeContainer.isRefreshing = it.loading

            if (it.schoolList.isNullOrEmpty()) {
                view?.recycler_view?.visibility = View.GONE
                view?.empty_view?.visibility = View.VISIBLE
            } else {
                view?.recycler_view?.visibility = View.VISIBLE
                view?.empty_view?.visibility = View.GONE
                view?.recycler_view?.adapter = schoolAdapter
                myAdapter.setSchoolList(it.schoolList)
            }
        })

Проблема при каждом обновлении свайпа. Сначала я вижу пустое представление, и как только появляются данные, я вижу список школ. Так что это своего рода неудобство пользовательского интерфейса. Это связано с тем, что viewState.copy(...) при каждом обновлении дает новое состояние пользовательскому интерфейсу. Как я могу преодолеть эту проблему?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Вы не должны показывать пустое представление, если ваш список пуст, потому что список все еще загружается - это не имеет смысла. Вместо этого вы должны показать это, только если loading = false и ваш список пуст. В этом случае у вас действительно нет другого выбора. Следовательно, ваш код может выглядеть следующим образом:

viewModel.onViewOpened().observe(this, Observer {
//Handling the SchoolsViewState here
        swipeContainer.isRefreshing = it.loading

        // if means the loading is finished 
        if (!it.loading) {
            if (it.schoolList.isNullOrEmpty()) {
                view?.recycler_view?.visibility = View.GONE
                view?.empty_view?.visibility = View.VISIBLE
            } else {
                view?.recycler_view?.visibility = View.VISIBLE
                view?.empty_view?.visibility = View.GONE
                view?.recycler_view?.adapter = schoolAdapter
                myAdapter.setSchoolList(it.schoolList)
            }
        } else {
            // here you could show some loading progress or similar
        }
    })
0 голосов
/ 03 ноября 2019

Вы обновляете список адаптеров, отличный от того, который установлен в качестве адаптера вашего представления Recyler, см. bookingsAdapter против myAdapter:

view?.recycler_view?.adapter = bookingsAdapter
myAdapter.setSchoolList(it.schoolList)

Это выглядит странно для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...