【问题标题】:Paging3-PagingDataAdapter,How to remove item? [duplicate]Paging3-PagingDataAdapter,如何移除item? [复制]
【发布时间】:2020-08-07 15:48:50
【问题描述】:

Android Paging3 alpha03,如何删除或更新项目?

请帮忙

【问题讨论】:

  • 您好,请详细描述您的问题。你到底尝试了什么?你的目标是什么?你遇到了什么错误?更多详细信息有助于其他人更好地了解您的问题。
  • 查看这篇文章sourcediving.com/…
  • 为什么这被标记为重复,并带有关于 Paging 2 的问题,这是一个完全不同的库?
  • pagingAdapter.refresh() 为我工作

标签: android paging


【解决方案1】:

当前更新后备数据集的唯一方法是调用PagingSource.invalidate 触发另一个REFRESH,然后通过PagingSource.getRefreshKey(state) 从当前位置重新加载。

例如,

val backingDataSet = mutableListOf(1, 2, 3)
class MyPagingSource : PagingSource<Int, Int> {
    override suspend fun load(...) = Page(
        data = backingDataset,
        nextKey = null,
        prevKey = null,
        itemsBefore = 0,
        itemsAfter = 0
    )

    override fun getRefreshKey(state: PagingState<Int, Int>) = state.anchorPosition
}

...

var currentPagingSource: MyPagingSource? = null
val pager = Pager(...) {
    MyPagingSource().also{
        currentPagingSource = it
    }
}

...

// To remove an item
backingDataSet.removeAt(0)
currentPagingSource.invalidate()

【讨论】:

  • 谢谢,我可以指定刷新第二页数据吗?
  • 当前您必须使整个源无效。
  • @dlam 使用peek() 修改项目然后调用notifyItemChanged 怎么样?这是一个坏方法吗?
  • @FlorianWalther 在更新后备数据集后总是失效。尝试将本地状态与分页后备数据同步确实很难正确执行,并且您不会在该路径上获得帮助。例如,您将如何解决 notifyItem 与 prepend 或 drop 之间的竞争?另一个困难的情况是从缓存的 PagingData 中恢复,您需要弄清楚呈现的内容并重新插入正确的项目。 SavedState 更加复杂。所以我绝对不建议直接使用 notify 来尝试聪明。
  • @dlam 感谢您的意见。如果我在列表中有 500 个分页项目,调用 invalidate 是否会从源代码重新加载它们?对吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多