Элементы списка Android Paging3 переходят к началу экрана и бесконечный цикл

У меня есть recyclerview в моем приложении, и я хотел заставить его работать с библиотекой Android paging3. Это работает, но не так, как я хотел. Здесь, когда я открываю список, количество данных, которое я определил в PagingConfig.pageSize, создается вверху. И когда я продолжаю прокручивать, он никогда не останавливается, как бесконечный цикл. Но когда я прокручиваю вниз, он работает нормально, вот так;

введите здесь описание изображения

как вы видите, прокрутка вверх всегда включена.

Я не знаю, в чем проблема, мои коды;

Мой Адаптер;

package com.tolgahantutar.bexworkfloww.ui.addressbook

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.Navigation
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.tolgahantutar.bexworkfloww.R
import com.tolgahantutar.bexworkfloww.data.models.userget.UserGetValue
import kotlinx.android.synthetic.main.contacts_layout.view.*

class UserAdapter() :
PagingDataAdapter<UserGetValue, UserAdapter.UserViewHolder>(DiffCallBack()) {

    class DiffCallBack : DiffUtil.ItemCallback<UserGetValue>(){
        override fun areItemsTheSame(oldItem: UserGetValue, newItem: UserGetValue): Boolean {
            return oldItem.name == newItem.name
        }

        override fun areContentsTheSame(oldItem: UserGetValue, newItem: UserGetValue): Boolean {
        return oldItem.name == newItem.name
        }

    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        holder.itemView.contac_name_textview.text =getItem(position)!!.name
        holder.itemView.user_profile_text_left_drawable.setText("${(getItem(position)!!.name.substringBefore(" ")).subSequence(0,1)}"+"${(getItem(position)!!.name.substringAfter(" ").subSequence(0,1))}")
        holder.itemView.contact_info_text.text = getItem(position)!!.title
        var getContactValue = getItem(position)!!
        holder.itemView.setOnClickListener {
            val action = AdressBookFragmentDirections.actionUserDetail(getItem(position)!!)
            Navigation.findNavController(it).navigate(action)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        return UserViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.contacts_layout, parent, false)
        )
    }

    class UserViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

    }

}

источник подкачки;


import androidx.paging.PagingSource
import com.tolgahantutar.bexworkfloww.data.models.userget.UserGetValue
import com.tolgahantutar.bexworkfloww.data.network.apis.WorkFlowServicesApi

class UserRemotePagingSource(private val api : WorkFlowServicesApi): PagingSource<Int,UserGetValue>(){
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, UserGetValue> {
        return try {
            val page = params.key?: 1
            val response = api.userGet(2,page,2)
            LoadResult.Page(
                data = response.body()!!.userGetValue,
                prevKey = page-1,
                nextKey = page+1
            )
        }catch (e: Exception){
            LoadResult.Error(e)
        }
    }
} 

ViewModel;

fun usersPagingFlow(): Flow<PagingData<UserGetValue>>{
        return Pager(
            config = PagingConfig(
                pageSize = 2,
                prefetchDistance = 2,
                enablePlaceholders = true,
                initialLoadSize = 2*3
            )
        ){
            UserRemotePagingSource(api)
        }.flow
    } 

И Фрагмент;

recycler_view_contacts.setHasFixedSize(true)
            recycler_view_contacts.adapter = pagingDataAdapter
        recycler_view_contacts.layoutManager = LinearLayoutManager(requireContext())

            lifecycleScope.launch {
                addressBookViewModel.usersPagingFlow().collectLatest { pagingData ->
                    pagingDataAdapter.submitData(pagingData)
                }
            } 

person Tolgahan Tutar    schedule 04.12.2020    source источник


Ответы (1)


В вашей реализации PagingSource похоже, что вам нужно проверить, когда ваш ключ равен 1, а затем установить prevKey в null, чтобы отметить конец списка.

Это похоже на то, что происходит, когда вы даете вашему API отрицательное число, это то, что он просто снова загружает первую страницу.

person dlam    schedule 24.12.2020
comment
Именно в этом была проблема. Спасибо! - person Tolgahan Tutar; 18.01.2021