如何更新 PagedListAdapter 中的单个项目
How to update a single item in a PagedListAdapter
我已经使用 ItemKeyedDataSource 实现了新的 PagedListAdapter。我的列表包含带有“赞”按钮的提要项目。单击“喜欢”按钮应刷新该项目。
为了在点击“赞”按钮时刷新我的列表项,我更新了我的 Firestore 后端中的状态,并在我的 ItemKeyedDataSource 上调用了 invalidate。但这将刷新我的整个列表,同时跳回到我的列表顶部。
我不确定这是否是正常行为,所以我去调试并检查我的 DiffUtil.ItemCallback 是否是问题所在。但是这两个方法(areItemsTheSame 和 areContentsTheSame)永远不会被调用。
那么在 DataSource 上调用 invalidate 是触发单个项目更新的方式吗? DiffUtil 会帮助我在更新后跟踪我在列表中的位置,还是我看错了方向?
经过一番挖掘,我找到了以下解决方案:
更新单个项目
您可以在适配器上调用notifyItemChanged。这将从数据源获取更新并更新列表项。
adapter.notifyItemChanged(selectedItemPosition)
刷新所有数据
您可以在 DataSource 上调用 invalidate
feedDataSourceFactory.feedLiveData.value!!.invalidate()
你可以像普通适配器一样修改,唯一的区别是你要使用getItem(position)
fun changeFavState(position: Int, isFavorite: Boolean) {
getItem(position)?.let {
it.isFavorite = isFavorite
}
notifyItemChanged(position)
}
我已经使用 ItemKeyedDataSource 实现了新的 PagedListAdapter。我的列表包含带有“赞”按钮的提要项目。单击“喜欢”按钮应刷新该项目。
为了在点击“赞”按钮时刷新我的列表项,我更新了我的 Firestore 后端中的状态,并在我的 ItemKeyedDataSource 上调用了 invalidate。但这将刷新我的整个列表,同时跳回到我的列表顶部。
我不确定这是否是正常行为,所以我去调试并检查我的 DiffUtil.ItemCallback 是否是问题所在。但是这两个方法(areItemsTheSame 和 areContentsTheSame)永远不会被调用。
那么在 DataSource 上调用 invalidate 是触发单个项目更新的方式吗? DiffUtil 会帮助我在更新后跟踪我在列表中的位置,还是我看错了方向?
经过一番挖掘,我找到了以下解决方案:
更新单个项目
您可以在适配器上调用notifyItemChanged。这将从数据源获取更新并更新列表项。
adapter.notifyItemChanged(selectedItemPosition)
刷新所有数据
您可以在 DataSource 上调用 invalidate
feedDataSourceFactory.feedLiveData.value!!.invalidate()
你可以像普通适配器一样修改,唯一的区别是你要使用getItem(position)
fun changeFavState(position: Int, isFavorite: Boolean) {
getItem(position)?.let {
it.isFavorite = isFavorite
}
notifyItemChanged(position)
}