我有一个
RecyclerView
及其 RecyclerView.Adapter
和视图支架。我正在尝试从列表中删除一个项目,代码如下,在 ViewHolder 中的删除按钮上的onClick()
内
int position = getAdapterPosition();
if(position > -1)
{
Place place = placeList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, getItemCount());
}
尽管删除视图并执行动画(列表也会受到影响),旧视图(或较低的视图)仍然存在或再次绘制。 例如,如果列表以 size = 5 开头,那么我尝试删除索引 4,他删除 4,然后仍然绘制 5 个视图。
编辑
如果我删除
notifyItemRangeChanged()
,那么只有当我执行以下操作时才会出现该错误
1-点击删除
2-快速单击按钮,将我带到新视图
3-返回到我可以删除的列表
4-开始删除,然后出现错误。即使
List
大小 = 0(使用 0 调用 getItemCount),仍保留 1 个项目。
如果我只调用 NotifyDataSetChanged(),那么它会删除项目,但视图只会留在那里!!
如有任何帮助或建议,我们将不胜感激。
谢谢。
编辑完成课程链接
使用下面的代码将解决您的问题。
holder.deleteImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(list.size()!=0){
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,list.size());
}
}
});
试试这个:
placeList.remove(position);
notifyItemRemoved(position);
我遇到了同样的问题,notifyItemRangeChanged() 调用没有帮助,而notifyDataSetChanged() 则有帮助(尽管停止了动画)。但我在 RecyclerView 上使用 ItemTouchHelper(以允许移动项目),很明显这个类造成了麻烦。
我的情况唯一的区别是,要重现此删除后重叠的错误,用户必须在删除项目时长按该项目。
我修改了 ItemTouchHelper.Callback 的重写 isLongPressDragEnabled() 方法以返回 false 而不是 true 后,问题就解决了。
lastImages.remove(position); (lastImages equals your array list)
newContentAdapter.notifyDataSetChanged();
这是作品。您必须将其从数组而不是项目中删除。然后通知适配器。仅此而已
对我来说notifyItemRemoved和notifyDataSetChanged不起作用。我尝试了一切,唯一对我有用的解决方案是在 onSwiped 方法中调用或重新加载回收器视图!
您不必创建需要声明为数组列表的位置列表的新引用。您无法从列表中添加或删除对象。你只能用 arraylist 来做到这一点。
更改此行
private List<Place> placeList;
Place place = placeList.remove(position);
到
private ArrayList<Place> placeList;
// other codes
placeList.remove(position);
// print placeList to confirm
notifyItemRemoved(position);
我遇到了这个问题 当我使用
notifyDataSetChanged()
时,它工作正常,但我想要动画,所以我使用 notifyItemRemoved(position)
进行动画,然后我使用 notifyDataSetChanged()
但我延迟了这些功能之间的间隔
我为它做了扩展,你可以在任何 RecylcerView 上使用它
fun RecyclerView.removeItem(position: Int){
adapter?.notifyItemRemoved(position)
handler.postDelayed({
adapter?.notifyDataSetChanged()
},300)
}
fun removeItemPosition(position: Int){
list.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position,itemCount)
}
您需要更新您的适配器;
在 Adapter 类中创建方法,您将在其中放置数据。
例如:
setData(List<Place> data);
当列表中的最后一项时,您需要写:
adapter.setData(null)
;
我也有同样的问题。只需设置 list = null 即可。就这样了。