【问题标题】:How to update a single item in a PagedListAdapter如何更新 PagedListAdapter 中的单个项目
【发布时间】:2020-04-25 23:24:28
【问题描述】:

我已经使用 ItemKeyedDataSource 实现了新的 PagedListAdapter。我的列表包含带有点赞按钮的提要项目。单击“赞”按钮应刷新该项目。

要在单击“赞”按钮时刷新我的列表项,我会更新我的 Firestore 后端中的状态,并在我的 ItemKeyedDataSource 上调用 invalidate。但这将刷新我的整个列表,同时跳回到我的列表顶部。

我不确定这是否是正常行为,所以我去调试和检查我的 DiffUtil.ItemCallback 是问题所在。但是这两个方法(areItemsTheSame 和 areContentsTheSame)永远不会被调用。

那么在 DataSource 上调用 invalidate 是触发单个项目更新的方法吗? DiffUtil 是否会帮助我在更新后跟踪我在列表中的位置,还是我看错了方向?

【问题讨论】:

  • 你使用 RecyclerView 吗?请分享一些代码

标签: android android-recyclerview android-jetpack android-pagedlistview


【解决方案1】:

你可以像普通适配器一样修改,唯一的区别是你要使用getItem(position)

fun changeFavState(position: Int, isFavorite: Boolean) {  
  getItem(position)?.let {  
  it.isFavorite = isFavorite  
  }  
  notifyItemChanged(position)  
}

【讨论】:

    【解决方案2】:

    经过一番挖掘,我找到了以下解决方案:

    更新单个项目

    您可以在适配器上调用 notifyItemChanged。这将从数据源获取更新并更新列表项。

    adapter.notifyItemChanged(selectedItemPosition)
    

    刷新所有数据

    您可以在 DataSource 上调用 invalidate

    feedDataSourceFactory.feedLiveData.value!!.invalidate()
    

    【讨论】:

    • 但是如何真正更新 PagedList 的内容呢?
    • @RaghavSatyadev 你是什么意思?在我的情况下,我的列表项有一个切换按钮。单击该按钮将触发服务器上的状态更改。调用 notifyItemChanged 将从服务器获取更新后的状态,并在 recyclerView 内部调用 onBind 以显示新状态。
    • 它将重新加载整个列表,假设用户在第 100 个项目上,然后使列表无效将把他扔到第一个项目上,整个进度将丢失。此外,adapter.notifyItemChanged(selectedItemPosition) 也不起作用,因为没有选项可以只更改本地列表中的一项,我们必须再次从应用程序中获取整个列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多