android - 如何正确使用 RecyclerView.Adapter notifyItemInserted/Removed?

标签 android android-recyclerview

例如,您有一个适配器,并在 onBindViewHolder 方法中将 OnClickListener 设置为某些 View (并根据 View 位置在那里执行一些操作)。您应该将 final 分配给方法 onBindViewHolder 的位置参数,以便可以从 onClick() 访问它。

更改数据集(删除或添加列表中的项目)后,您调用 onItemInserted 或 onItemRemoved,这实际上在 recyclerview 中添加/删除了一个 View ,但它不会刷新其他 View 项,因此当您单击相邻 View 项时,它将打开一个屏幕或显示具有无效索引的数据。为了避免这种情况,我基本上调用 notifyDatasetChanged 来调用 onBind 到所有可见 View 并删除/添加一些 View 。

那么如何在调用 notifyItemInserted/removed 时刷新其他 View ,或者如何适本地使用这些方法?

最佳答案

如果在未调用 notifyDataSetChanged 的情况下插入或删除数据集中的项目,则将位置分配给 onBindViewHolder 中的变量将导致不一致的状态。

要使用 onItemInsertedonItemRemoved,viewholder 中的数据应该保持一致,因为它不会被重绘并且 onClick 会使用这个无效位置添加或删除项目之前分配。

对于这个和其他用例,RecyclerView.ViewHolder 提供了访问其位置和 ID 的方法:

使用 getAdapterPosition()getItemId() 获取有效的位置和 ID。

另请查看 RecyclerView.ViewHolder 中可用的其他方法.

关于android - 如何正确使用 RecyclerView.Adapter notifyItemInserted/Removed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35812485/

相关文章:

android - recyclerview 或 viewpager 上的 setRotationY(180) 在 Android 9(API 28)中创建滚动问题

java - 声明 boolean 变量

android - 如何从 Assets 或原始文件夹中查看 pdf?

android - 带有 SimpleCursorAdapter 的空白 ListView

android - 如何解析本地 JSON 并填充 RecyclerView?

android - 列表过滤与 Material Design 兼容?

android - ScrollView 不会回到布局的开头 - Android

javascript - 将 d3.js 中的一种可视化集成到 Android 应用程序中

android - 如何更改 recyclerview 第一行布局?

java - 从 Firebase 检索数据到 fragment 上嵌入的 RecyclerView