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

时间:2017-01-16 12:27:28

标签: android android-recyclerview

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

总之,我希望在保持整个RV卡更新的同时,将单项操作通知给RecyclerView。

我尝试adapter.notifyItemRangeChanged(0, arrayList.size()),但其行为与notifyDataSetChanged()相同

2 个答案:

答案 0 :(得分:2)

我假设您在:

中使用参数位置
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
适配器

尝试使用

holder.getAdapterPosition()

代替。这应该可以解决你的问题。

答案 1 :(得分:1)

在代码中操作异常或由事件启动的任何位置使用holder.getAdapterPosition()。在这种情况下,当在用户点击等事件上调用异步回调时,传递到position的{​​{1}}将无效。在任何其他地方,使用传递的onBindViewHiolder

是安全的

请注意,positionadapter.notifyItemInserted(0)不会导致其他回收视图反弹。只是他们的观看者位置会更新。这是为了优化以及adapter.notifyItemRemoved(position)陈旧的原因