为什么我将recyclerview的项目位置设为“-1”?

时间:2018-02-27 23:52:12

标签: android android-recyclerview

我有一个非常奇怪的错误。基本上我正在尝试删除LongClick上的recyclerview项目,但在某些情况下我将adapter position作为-1

我的代码:

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {


 Message message = mMessages.get(position);
 holder.setMessage(message.getMessage());

  holder.msgContainer.setOnLongClickListener(view -> {
  int position = holder.getAdapterPosition();

  mMessages.remove(position);
 notifyItemRemoved(position);
 notifyItemRangeChanged(position, mMessages.size());


    return false;
   });

 }

 }
  }

2 个答案:

答案 0 :(得分:0)

来自文档:在下一次布局遍历之前,RecyclerView不会处理任何适配器更新。这可能会导致用户在屏幕上看到的内容与适配器内容之间存在暂时的不一致。

这是一个常见问题,只需将您的调用包装在if语句中,检查该位置是否为-1。

if (getAdapterPosition() != - 1)

答案 1 :(得分:0)

getAdapterPosition()返回-1。这意味着Adapter获取NO_POSITION,并且在调用notifyDataSetChanged()之类的方法时总会发生这种情况。我们总是使用这样的位置

@Override
 public void onBindViewHolder(ViewHolder holder, final int position) {


  Message message = mMessages.get(position);
  holder.setMessage(message.getMessage());

  holder.msgContainer.setOnLongClickListener(view -> {
 //you can use the position  parameter directly,just set it as final
  mMessages.remove(position);
  notifyItemRemoved(position);
  notifyItemRangeChanged(position, mMessages.size());
     return false;
   });
}