Android notifyItemRemoved()通知错误的索引

时间:2017-03-28 08:24:54

标签: android list android-recyclerview notify notifydatasetchanged

美好的一天。我有一个小聊天应用程序,我只想在本地删除聊天项目。

通过调试我可以认为notifyItemRemoved()有问题,如下所示:

•我已经从我的List中调试了返回的索引,并且索引对于列表是正确的。

•我已经从ViewHolder调试了返回的Model Class,并且返回的模型类是正确的。

•我在我的模型中调试了我的自定义equals()方法,并正确地比较了正确的项目。

关于我的调试的主要抱怨是我不知道为什么,但是equals()方法被调用了2次...虽然如果你有时间请考虑这个案例,这很奇怪。

主要问题是notifyItemRemoved()总是删除不正确的项目,但总是必须删除项目上方的1个项目(通过删除的方式我的意思是从视图中删除,因为从列表中删除正确发生)

所以我不知道这里发生了什么。

这是我的自定义equals()方法

  @Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (obj instanceof ChatModel) {
        ChatModel chatModel = (ChatModel) obj;
        if (chatModel.getMessageId().equals(messageId)) {
            return true;
        }
    }
    return false;
}

@Override
public int hashCode() {
    return messageId.hashCode();
}

以下是我如何将项目插入适配器列表。

对于模型列表 - >

 public void insertChatModelWithItemNotify(List<ChatModel> chatModel, boolean firstPaging) {
    if (firstPaging) {
        this.chatModelList.addAll(chatModel);
        notifyDataSetChanged();
    } else {
        this.chatModelList.addAll(0, chatModel);
        notifyItemRangeInserted(0, chatModel.size());
    }
}

对于单个模型 - &gt;

    public void insertChatModel(ChatModel chatModel) {
    this.chatModelList.add(chatModel);
    notifyDataSetChanged();
}

以下是我从列表中删除项目的方法

  public void removeItem(ChatModel chatModel) {
    int position = this.chatModelList.indexOf(chatModel);
    this.chatModelList.remove(chatModel);
    notifyItemRemoved(position);
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能在RecyclerView中添加了某种标题,这使得对象列表中的对象索引与RecyclerView中的View索引不同。