0

Bonne journée. J'ai une petite application de chat où je veux simplement supprimer l'article de chat localement.Android notifyItemRemoved() Mauvais index notifié

Par débogage autour je peux pense qu'il ya quelque chose de mal avec notifyItemRemoved() comme suit:

• Je déboguée l'indice retourné de ma liste et l'indice était correct pour la liste.

• J'ai débogué la Classe Modèle renvoyée du ViewHolder et la classe de modèle retournée était correcte.

• J'ai débogué ma méthode personnalisée equals() dans mon modèle et comparait correctement le bon article. Le principal se plaignent de mon débogage est je ne sais pas pourquoi, mais la méthode equals() est appelée 2 fois ... assez bizarre mais si vous auriez le temps s'il vous plaît envisager cette affaire aussi bien. Le principal problème est le notifyItemRemoved() enlève toujours pas l'élément correct, mais toujours 1 élément au-dessus de l'élément qui doit être supprimé (en moyen de supprimé je veux dire supprimé de la vue comme la suppression de la liste se passe correctement

Donc, je n'ai aucune idée de ce qui se passe ici.

Voici mon habitude equals() méthodes

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

Voici comment j'insérer des éléments dans la liste de l'adaptateur.

Pour la liste des modèles->

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

Pour un modèle unique ->

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

Voici comment je supprimer l'élément de la liste

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

Toutes les idées ?

+0

Essayez d'ajouter 'notifyItemRangeChanged' après' notifyItemRemoved' – Ricardo

+0

En passant, ajoutez-vous un en-tête à la liste? Ou faire une sorte de logique qui rend l'index d'objet dans la liste différent de l'index de vue dans la vue de recycleur? – Ricardo

+0

Got damnnnn it ............ aaaaa vous avez raison! Je fais une telle chose ...... J'ai entête et la taille retournée est différente pour l'adaptateur, mais pourquoi cela affecte la position réelle de la liste? comme la liste n'est jamais ajoutée un élément supplémentaire seulement les éléments de chat de message sont ajoutés à la liste, mais c'est probablement le cas pourquoi la liste est supprimée correctement et la vue n'est pas notifiée correctement, ok va essayer avec la position +1, si travaillé, mettre cela comme un égout –

Répondre

0

Vous ajoutez probablement une sorte d'en-tête à RecyclerView, ce qui rend l'index d'objet de votre liste d'objets différent de l'index View dans RecyclerView.

+0

correct! fixé et travaillant comme un charme –