【问题标题】:RecyclerView notifyItemRemoved(position) not working properlyRecyclerView notifyItemRemoved(位置)无法正常工作
【发布时间】:2017-04-05 12:18:10
【问题描述】:

我有一个 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 size = 0,仍有 1 项保留(使用 0 调用 getItemCount)。

如果我只调用 NotifyDataSetChanged(),那么它会删除项目,但视图只是停留在那里!!

感谢任何帮助或建议。

谢谢。

EDIT完成课程LINK

【问题讨论】:

  • 我也面临这个问题,尝试了网上所有可用的方法,但完全没有效果。但在我的情况下,它有时确实可以正常工作,但有时它会在我触摸我的列表时立即删除空格
  • @Vivek Mishra 我点击删除的正常行为,它在没有 notifyItemRangeChanged() 的情况下工作。但是如果我转到新视图,请返回,>> 错误发生
  • 我在 onSwiped 方法中调用了重新加载的回收器视图。有效!虽然它会删除动画。

标签: android android-recyclerview


【解决方案1】:

试试这个:

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

【讨论】:

  • 请检查我的编辑。这也已经在我的代码中了,我看不出有什么区别?!
【解决方案2】:

使用下面的代码可以解决你的问题。

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

         }
    });

【讨论】:

  • 我在删除之前和之后做了日志大小,列表大小不是 0
  • 你的意思是你删除了所有的行,你的列表大小仍然有一个。
  • 我删除了所有的行,最后,1 个项目仍然可见,但是 getItemCount = 0。一个视图仍然在那里绘制
  • 检查 link 是完整的类
  • 用 if(position.size != 0) 替换这个 if(position > -1)
【解决方案3】:

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

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

在我修改 ItemTouchHelper.Callback 的覆盖 isLongPressDragEnabled() 方法以返回 false 而不是 true 后,问题得到解决。

【讨论】:

    【解决方案4】:
      lastImages.remove(position); (lastImages equals your array list)
      newContentAdapter.notifyDataSetChanged();
    

    它是有效的。你必须在你的数组而不是项目中删除它。然后通知适配器。就这些

    【讨论】:

    • 我在活动中使用从回收视图中删除项目。我在活动中删除了项目,然后使用以下命令将新数组从活动发送到适配器:.notifyDataSetChanged。所以所有的问题都用这种方式解决了。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您需要更新适配器;

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

        例如:setData(List&lt;Place&gt; data);

        当列表中的最后一项时你需要写:adapter.setData(null);

        我遇到了同样的问题。只需设置 list = null。就是这样。

        【讨论】: