【问题标题】:How to stop looping same recycler view data in Android?如何停止在 Android 中循环相同的回收器视图数据?
【发布时间】:2021-02-27 18:09:26
【问题描述】:

在我的 API 中,没有每个产品的 pageSize 或唯一 id,但我仍然在适配器内部实现了 Paging 3 库和比较器,以及用于最新更改的实时数据。

现在的问题是:假设我的 API 中总共只有 10 个项目,我获取它并显示在列表中。但是一旦我滚动 10 个项目,再次显示 10 个项目,并且再次......并且无限!!

我怀疑我的 3 个错误,一个是因为分页实现错误(下一个上一个键),或者第二个问题是因为比较器和第三个问题,我覆盖了 getRefreshKey 并通过了 state.anchorPosition。

代码:

ProductPagingSource

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
        }
    }
}

【问题讨论】:

    标签: android kotlin android-recyclerview android-paging-3


    【解决方案1】:

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

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

    【讨论】:

    • 嘿,感谢您的快速回复,但在我的 API 中没有提供每个密钥或类似的选项,其次,只有 10 个数据,并且该数据在片刻后正确显示,当我再次向下滚动时,第 1 到 10 个数据正在发生变化
    • 这是一个演示目的,我是通过观看教程来完成的,在那个教程中,所有的关键和类似的东西都在那里。我也想做同样的事情,假设我也会得到类似的 api。只是了解这是我的要求
    • 如果您的列表中只有 10 个项目,您为什么要在这里使用分页?只加载 10 个项目 once 吗?正如这个答案已经向您解释的那样,您一遍又一遍地调用相同的数据,为什么会改变?
    • 实际上我不想这样做,但问题是我遵循了一个教程系列(14 个视频)并且他使用了 dagger hilt+ mvvm+ paging + glide n all。所以我还有一个任务要做,所以我再次关注那个,但问题是他使用了分页并根据该任务制作了更多视频,现在如果我打破这个顺序,将会有很多变化,我会卡在某个地方
    • 这意味着您的问题实际上根本不涉及分页,对吧?你需要去研究如何在没有分页库的情况下进行 api 调用,因为此时你不需要它。这意味着,这个答案是完全正确的,因为你没有真正的理由使用分页
    猜你喜欢
    • 2017-08-05
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-10-06
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多