После того, как запрос запущен в ViewModel - PullRequest
0 голосов
/ 29 сентября 2019

Я написал функцию, которая загружает список в представлении переработчика.Все работает правильно, но только один раз, во второй раз, когда я дохожу до конца, происходит вызов, но функция загрузки из API не запускается, но если вы закрываете представление и открываете его, появляется другой запрос.Я предполагаю, что ViewModel работает только один раз, а затем сохраняет свое состояние, и когда я запрашиваю дополнительные данные, происходит возврат старых.Таким образом, я вижу два варианта: пересоздать запрос или закрыть его после обработки.Код моего фрагмента:

private fun subscribeUi(binding: FragmentThemesBinding, adapter: LegoThemeAdapter) {
    viewModel.legoThemes.observe(viewLifecycleOwner, Observer { result ->
        when (result.status) {
            Result.Status.SUCCESS -> {
                binding.progressBar.hide()
                result.data?.let {
                    adapter.submitList(it)
                    binding.recyclerView.setOnScrollListener(scrollListener(binding, adapter))
                }//Передаем данные в адаптер
            }
            Result.Status.LOADING -> binding.progressBar.show()
            Result.Status.ERROR -> {
                binding.progressBar.hide()
                Snackbar.make(binding.root, result.message!!, Snackbar.LENGTH_LONG).show()//Показываем ошибку
            }
        }
    })
}

private fun scrollListener(binding: FragmentThemesBinding, adapter: LegoThemeAdapter): RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)
        val visibleItemCount = (recyclerView.layoutManager as LinearLayoutManager).childCount//смотрим сколько элементов на экране
        val totalItemCount = (recyclerView.layoutManager as LinearLayoutManager).itemCount//сколько всего элементов
        val firstVisibleItems = (recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()//какая позиция первого элемента
        if (!isLoading) {//проверяем, грузим мы что-то или нет, эта переменная должна быть вне класса  OnScrollListener
            if (visibleItemCount + firstVisibleItems >= totalItemCount) {
                isLoading = true
                isAddList = true//ставим флаг что мы попросили еще элемены
                subscribeList(binding, adapter)
            }
        }
    }
}

private fun subscribeList(binding: FragmentThemesBinding, adapter: LegoThemeAdapter) {
    viewModel.updateAdd.observe(viewLifecycleOwner, Observer { result ->
        when (result.status) {
            Result.Status.SUCCESS -> {
                binding.progressBar.hide()
                result.data?.let {
                    adapter.submitList(it)
                    adapter.notifyDataSetChanged()
                    isLoading = false
                }//Передаем данные в адаптер
            }
            Result.Status.LOADING -> binding.progressBar.show()
            Result.Status.ERROR -> {
                binding.progressBar.hide()
                isLoading = true
                Snackbar.make(binding.root, result.message!!, Snackbar.LENGTH_LONG).show()//Показываем ошибку
            }
        }
    })
}

ViewModel:

    val legoThemes = repository.themes
    val updateAdd by lazy {
    repository.updateAdd()
    }

Я хотел бы знать, где я ошибся и какой вариант вы все еще можете использовать?

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