Я написал функцию, которая загружает список в представлении переработчика.Все работает правильно, но только один раз, во второй раз, когда я дохожу до конца, происходит вызов, но функция загрузки из 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()
}
Я хотел бы знать, где я ошибся и какой вариант вы все еще можете использовать?