0

美好的一天。我有一个小聊天应用程序,我想简单地删除本地聊天项目。Android notifyItemRemoved()错误索引通知

通过调试左右我就可以估摸有什么毛病notifyItemRemoved()如下:

•我已经从我的名单调试返回的指数和指数的列表是正确的。

•我调试了ViewHolder返回的模型类,返回的模型类是正确的。

•我已经在我的模型中调试了自定义的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); 
} 

任何想法删除项目?

+0

尝试在'notifyItemRemoved'后添加'notifyItemRangeChanged' – Ricardo

+0

顺便说一下,你是否将某种标题添加到列表视图?或者做一些使得列表中的对象索引与回收器视图中的视图索​​引不同的逻辑? – Ricardo

+0

得到了这个............ aaaaa你是对的!我做这样的事情......我有头文件,并且返回的大小对于适配器是不同的,但为什么会影响实际的列表位置?因为列表永远不会被添加任何额外的项目,所以只有消息聊天项目被添加到列表中,但可能这就是为什么列表被正确删除并且视图没有被正确通知的情况,ok会尝试+1位置,如果工作,把那个aswer –

回答

0

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

+0

正确!固定和像魅力一样工作 –