在我的 API 中,没有每个产品的 pageSize 或唯一 id,但我仍然在适配器内部实现了 Paging 3 库和比较器,以及用于最新更改的实时数据。
现在的问题是:假设我的 API 中总共只有 10 个项目,我获取它并显示在列表中。但是一旦我滚动 10 个项目,再次显示 10 个项目,并且再次......并且无限!
我怀疑我的 3 个错误,一个是因为分页实现错误(下一个上一个键),或者第二个问题是因为比较器和第三个问题,我覆盖了 getRefreshKey 并通过了 state.anchorPosition。
代码:
产品分页源
class ProductPagingSource(
private val productApi: ProductApi,
) : PagingSource<Int, Products>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Products> {
val position = params.key ?: PRODUCT_STARTING_PAGE_INDEX
return try {
val response =
productApi.getProducts() //Not added load size, position and other params, because in API, there is no data related to that.
val products = response.products
LoadResult.Page(
data = products,
prevKey = if (position == PRODUCT_STARTING_PAGE_INDEX) null else position - 1,
nextKey = if (products.isEmpty()) null else position + 1
)
} catch (exception: IOException) {
LoadResult.Error(exception)
} catch (exception: HttpException) {
LoadResult.Error(exception)
}
}
override fun getRefreshKey(state: PagingState<Int, Products>): Int? {
return state.anchorPosition
}
}
产品适配器
class ProductAdapter(context: Context?) :
PagingDataAdapter<Products, ProductAdapter.ProductViewHolder>(PRODUCT_COMPARATOR) {
private lateinit var mContext: Context
init {
if (context != null) {
mContext = context
}
}
.
.
.
private val PRODUCT_COMPARATOR = object : DiffUtil.ItemCallback<Products>() {
override fun areItemsTheSame(oldItem: Products, newItem: Products) =
oldItem.name == newItem.name
override fun areContentsTheSame(oldItem: Products, newItem: Products) =
oldItem == newItem
}
}
}