如何更新 PagedListAdapter 中的单个项目

Luc*_*ano 6 android android-recyclerview android-jetpack android-pagedlistview

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

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

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

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

小智 8

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

fun changeFavState(position: Int, isFavorite: Boolean) {  
  getItem(position)?.let {  
  it.isFavorite = isFavorite  
  }  
  notifyItemChanged(position)  
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ano 2

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

更新单个项目

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

adapter.notifyItemChanged(selectedItemPosition)
Run Code Online (Sandbox Code Playgroud)

刷新所有数据

您可以对数据源调用 invalidate

feedDataSourceFactory.feedLiveData.value!!.invalidate()
Run Code Online (Sandbox Code Playgroud)

  • 它将重新加载整个列表,假设用户正在第 100 个项目上,那么使列表无效将把他扔到第一个项目上,整个进度将丢失。另外,adapter.notifyItemChanged(selectedItemPosition) 也不起作用,因为没有选项可以仅更改本地列表中的一项,我们必须从应用程序中再次获取整个列表 (2认同)