我有可以在位置0(顶部)添加的RecyclerView卡,并删除列表中的任何卡。事实上,每张卡片都有更多的选择"显示引用每张卡的PopupMenu的按钮。见截图:
事情是,如果我想要一个动画,我需要在删除时添加adapter.notifyItemInserted(0)
adapter.notifyItemRemoved(position)
。但是,如果我不使用adapter.notifyDataSetChanged()
,则其他卡的ID不会更新,如果我尝试扩展PopupMenu或删除任何其他卡,我会得到IndexOutOfBoundsException
,因为我正在尝试使用不再存在的ID(在删除卡的情况下)。
总之,我希望在保持整个RV卡更新的同时,将单项操作通知给RecyclerView。
我尝试adapter.notifyItemRangeChanged(0, arrayList.size())
,但其行为与notifyDataSetChanged()
相同
答案 0 :(得分:2)
我假设您在:
中使用参数位置@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
适配器尝试使用
holder.getAdapterPosition()
代替。这应该可以解决你的问题。
答案 1 :(得分:1)
在代码中操作异常或由事件启动的任何位置使用holder.getAdapterPosition()
。在这种情况下,当在用户点击等事件上调用异步回调时,传递到position
的{{1}}将无效。在任何其他地方,使用传递的onBindViewHiolder
。
请注意,position
或adapter.notifyItemInserted(0)
不会导致其他回收视图反弹。只是他们的观看者位置会更新。这是为了优化以及adapter.notifyItemRemoved(position)
陈旧的原因