RecyclerView添加/删除动画,同时保持ID的更新

问题描述:

我有RecyclerView卡,我可以在位置0(顶部)添加并删除列表中的任何卡。事情是,每张卡片都有一个“更多选项”按钮,显示每张卡片的PopupMenu参考。见截图:
rc demo
事情是,如果我想要一个动画,我需要使用adapter.notifyItemInserted(0)在添加,adapter.notifyItemRemoved(position)后删除。但是,如果我不使用adapter.notifyDataSetChanged(),其他卡的ID将不会更新,如果我尝试扩展PopupMenu或删除任何其他卡,我会得到一个IndexOutOfBoundsException,因为我试图使用一个不存在的ID (在删除卡的情况下)。RecyclerView添加/删除动画,同时保持ID的更新

总之,我期待通知RecyclerView的单个项目操作,同时保持整个RV卡更新。

我试图adapter.notifyItemRangeChanged(0, arrayList.size())但它的作用一样notifyDataSetChanged()

+0

然后很明显你的ID是错误选择的...其他ID不应该改变当你删除一个项目(ID应该是稳定的) – Selvin

+0

@Selvin我不是手动设置ID 。 –

+0

如果您想获得帮助,请显示您的代码。 – Divers

在您的代码中的任何地方使用holder.getAdapterPosition(),其中的操作是异步的或由事件启动。在这种情况下,当像用户点击一样的事件上调用异步回调时,传递到onBindViewHiolderposition将无效。在任何其他地方,使用通过的position是安全的。

只是要注意,adapter.notifyItemInserted(0)adapter.notifyItemRemoved(position)不会导致其他recyclerview是反弹。只是他们的观点职位将被更新。这是为了优化和之所以position陈旧

+0

感谢您的洞察力。它按预期工作。 –

我假设你正在使用参数位置在:

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
适配器

。尝试使用

holder.getAdapterPosition() 

改为。这应该可以解决你的问题。