-1

在我的 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
        }
    }
}
4

1 回答 1

2

如果没有 API 文档,我只能笼统地回答这个问题:

当你告诉它总是获取相同的数据时,它可能总是获取相同的数据——这意味着我们的业务逻辑是有缺陷的,因为productApi.getProducts()需要获取每个键(通常称为“下一页令牌”)。如果 API 不支持分页,您必须使用存储库,然后使用分页支持查询本地 SQLite。

于 2021-02-27T18:22:30.240 回答