RecyclerView notifyItemRemoved(位置)无法正常工作

问题描述 投票:0回答:9

我有一个

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(),那么它会删除项目,但视图只会留在那里!!

如有任何帮助或建议,我们将不胜感激。

谢谢。

编辑完成课程链接

android android-recyclerview
9个回答
11
投票

使用下面的代码将解决您的问题。

 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());
            }

         }
    });

9
投票

试试这个:

placeList.remove(position);
notifyItemRemoved(position);

3
投票

我遇到了同样的问题,notifyItemRangeChanged() 调用没有帮助,而notifyDataSetChanged() 则有帮助(尽管停止了动画)。但我在 RecyclerView 上使用 ItemTouchHelper(以允许移动项目),很明显这个类造成了麻烦。

我的情况唯一的区别是,要重现此删除后重叠的错误,用户必须在删除项目时长按该项目。

我修改了 ItemTouchHelper.Callback 的重写 isLongPressDragEnabled() 方法以返回 false 而不是 true 后,问题就解决了。


1
投票
  lastImages.remove(position); (lastImages equals your array list)
  newContentAdapter.notifyDataSetChanged();

这是作品。您必须将其从数组而不是项目中删除。然后通知适配器。仅此而已


0
投票

对我来说notifyItemRemoved和notifyDataSetChanged不起作用。我尝试了一切,唯一对我有用的解决方案是在 onSwiped 方法中调用或重新加载回收器视图!


0
投票

您不必创建需要声明为数组列表的位置列表的新引用。您无法从列表中添加或删除对象。你只能用 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);

0
投票

我遇到了这个问题 当我使用

notifyDataSetChanged()
时,它工作正常,但我想要动画,所以我使用
notifyItemRemoved(position)
进行动画,然后我使用
notifyDataSetChanged()
但我延迟了这些功能之间的间隔

我为它做了扩展,你可以在任何 RecylcerView 上使用它

fun RecyclerView.removeItem(position: Int){
   adapter?.notifyItemRemoved(position)
   handler.postDelayed({
       adapter?.notifyDataSetChanged()
   },300)
}

0
投票
fun removeItemPosition(position: Int){
    list.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position,itemCount)
}

-3
投票

您需要更新您的适配器;

在 Adapter 类中创建方法,您将在其中放置数据。

例如:

setData(List<Place> data);

当列表中的最后一项时,您需要写:

adapter.setData(null)

我也有同样的问题。只需设置 list = null 即可。就这样了。

© www.soinside.com 2019 - 2024. All rights reserved.