1
resposta

Atualizar Lista [Pagination API rest]

Pessoal, estou mostrando uma lista de uma chamada API, estou usando pagination, enfim criei a função que captura a próxima página quando da o scroll, como eu faço para atualizar a nova lista com o pagination?

AQUI O REPOSITORIO

class GitHubRepository {

    private val api: GitHubApi = RetrofitServices.gitHubApi

    suspend fun getListRepository(page: Int) =
        withContext(Dispatchers.IO) { api.getRepositories(page) }
}

O FRAGMENTO

    private fun setupObserver() {
        viewModel.listRepository.observe(viewLifecycleOwner, ::onSuccess)
        viewModel.fetchInformation(setupPagination())
    }

    private fun onSuccess(list: List<GitHubListVO>) = with(binding.recyclerView) {
        initRecyclerView(list)
        visibility = View.VISIBLE
    }

    private fun initRecyclerView(list: List<GitHubListVO>) = with(binding.recyclerView) {
        layoutManager = LinearLayoutManager(requireContext())
        setHasFixedSize(true)
        adapter = GitHubListAdapter(list)
    }

    private fun setupPagination(): Int {
        nestedScrollView = binding.nestedScrollView
        val isPagination = true
        if (isPagination) {
            nestedScrollView.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener {
                    v, scrollX, scrollY, oldScrollX, oldScrollY ->
                if (scrollY==v.getChildAt(0).measuredHeight -v.measuredHeight) {
                    ++ pageCount
                }
            })
        }
        return  pageCount
    }
1 resposta

Olá, Luciano! Como vai?

Pelo que entendi, você já criou a função que captura a próxima página quando o scroll é acionado, certo? Agora você precisa atualizar a nova lista com a paginação.

Uma forma de fazer isso é modificar a função fetchInformation no seu ViewModel para receber o número da página como parâmetro. Assim, você pode chamar essa função novamente quando a próxima página for carregada. Algo assim:

fun fetchInformation(page: Int) {
    viewModelScope.launch {
        val newList = repository.getListRepository(page)
        val currentList = listRepository.value ?: emptyList()
        listRepository.value = currentList + newList
    }
}

No seu Fragment, você pode chamar essa função fetchInformation passando o número da página atualizado quando o scroll chegar ao final. Algo assim:

private fun setupPagination() {
    nestedScrollView = binding.nestedScrollView
    val isPagination = true
    if (isPagination) {
        nestedScrollView.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
            if (scrollY == nestedScrollView.getChildAt(0).measuredHeight - nestedScrollView.measuredHeight) {
                viewModel.fetchInformation(pageCount + 1)
            }
        })
    }
}

Dessa forma, a função fetchInformation será chamada novamente com a próxima página, e a nova lista será atualizada corretamente.

Espero ter ajudado e bons estudos!