android - 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)
}
}
}
视图模型;
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)
}
}
解决方案
在您的 PagingSource 实现中,您似乎需要检查您的键何时为 1,然后设置prevKey
为null
标记列表的末尾。
当你给你的 api 一个负数时,看起来会发生什么,它只是再次加载第一页。
推荐阅读
- android - 蓝牙不会在后台模式下扫描附近的设备 android 11+
- fullcalendar - 未在完整日历上显示的事件
- c++ - 我的代码编译得很好,但在 geeksforgeeks 上提交时显示分段错误.....我无法识别问题
- go - 一个 CustomType protobuf
- r - 在 R 中添加特定列值
- c# - 针对 Intranet 应用程序的 Active Directory 安全建议/洞察
- torch - [libtorch][torch.jit.script][输入动态形状]加载“. C++ 上的 pt” 文件:索引超出范围
- mysql - 如何使用特定表中的列作为我需要从中删除、插入或更新数据的表名
- openalpr - OpenALPR 免费版和付费版有什么区别?
- mudblazor - 更改 MudBlazor 图表的外观