Android notifyItemRemoved() 通知了错误的索引
Android notifyItemRemoved() Wrong Index notified
美好的一天。我有一个小型聊天应用程序,我想在其中简单地删除本地的聊天项目。
通过四处调试,我可以估计 notifyItemRemoved() 有问题,如下所示:
• 我已经调试了从我的列表中返回的索引,并且该索引对于列表是正确的。
• 我已经调试了从 ViewHolder 返回的模型 Class,返回的模型 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());
}
}
对于单个模型 - >
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);
}
有什么想法吗?
您可能正在向 RecyclerView 添加某种 header,这使得 object 列表中的 object 索引不同于 RecyclerView 中的视图索引。
美好的一天。我有一个小型聊天应用程序,我想在其中简单地删除本地的聊天项目。
通过四处调试,我可以估计 notifyItemRemoved() 有问题,如下所示:
• 我已经调试了从我的列表中返回的索引,并且该索引对于列表是正确的。
• 我已经调试了从 ViewHolder 返回的模型 Class,返回的模型 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());
}
}
对于单个模型 - >
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);
}
有什么想法吗?
您可能正在向 RecyclerView 添加某种 header,这使得 object 列表中的 object 索引不同于 RecyclerView 中的视图索引。