RecyclerView et refresh des données de la liste

#1

Bonjour à tous,

J’ai mis en place une liste de personnages avec un RecyclerView. La liste comporte une centaine de personnages. J’ai également mis à disposition un menu paramètre pour pouvoir filtrer cette liste et ne faire apparaître que certains personnages.
L’utilisateur choisit son type de personnage et retourne sur l’écran principal. Les données sont bien enregistrées dans le LocalPreferences et le filtre est bien récupéré dans mon adapter. Le problème c’est que ma liste ne se met pas à jour. J’ai tenté quelques recherches sur le net et j’y ai trouvé quelques fonctions comme diffUtil ou notifydatasetchanged, mais je ne suis pas certain qu’elles correspondent à mon besoin.
Quelqu’un a déjà eu le même problème ? Ou essayé de mettre en place quelque chose de similaire ?

Merci d’avance pour votre aide !

#2

Hello,

Si, le notifyDataSetChanged() est obligatoire pour faire appliquer tes nouveaux paramètres à l’adapter. Si tu fais aussi du Swift, c’est un petit peu comme le reloadData() d’une TableView.

Et ce notifyDataSetChanged() permet de refaire une boucle complète de ton adapter donc de prendre tes nouveaux paramètres en compte.
Est-ce que tes paramètres sont bien passés dans l’adapter au moment de la déclaration de ta classe ?

#3

Hello Schtipoun,
Pour l’instant, j’ai pas vraiment creusé le sujet. J’ai vu tellement de chose sur le net que je voulais voir si quelqu’un avait déjà eu ce cas là.
Je ne passe aucun paramètre, hormis le context … :wink:
Mais je vais creuser dans ce sens.
Je ne savais pas si il fallait effacer le contenu de la liste ou si l’adapter rechargeait automatiquement la nouvelle liste …
Merci pour le tuyau !!

#4

Ah oui, non effectivement, l’adapter n’efface pas la liste.
Il faut que tu appelles un clear() avant de le faire pour qu’il reparte d’une liste vide sinon, il va t’ajouter tes nouveaux éléments (avec le append, le mapNotNullTo ou peu importe la fonction que tu utilises) à la fin de ta liste déjà constituée.
Si tu as toujours des soucis, dis le moi, je dois avoir bidouillé ça dans une de mes applications. Je jetterai un coup d’oeil.

#5

Hello Schtipoun,
J’ai tenté d’utiliser le notifyDataSetChanged() mais je n’obtiens rien … :slight_smile:
En gros j’ai un settings activity où je laisse le choix du filtre à adopter et au back je reviens sur mon MainActivity.
J’ai tenté de gérer l’ordre du notifyDataSetChanged dans l’adapter mais j’ai l’impression qu’il ne repasse jamais dans les fonctions de Create, GetItems et Bind.
J’ai essayé de surcharger la fonction onStop et onResume du MainActivity sans succès.
Sais-tu dans quelle fonction et quelle activité déclencher cette ordre ?

#6

Hello,

Au moment de démarrer ta nouvelle activity via un intent, est-ce que tu as fait un startActivityForResult() pour récupérer le résultat de ton activity et donc faire des actions en conséquence ?

#7

Hello schtipoun,
J’ai réussi à mettre en place le startActivityForResult et j’arrive à déclencher un toast message au retour sur mon MainActivity. Par contre, je n’arrive pas à déclencher le refresh avec le notifyDataSetChanged …
Voici un extrait de mon code :

Du coup, je suis passé à autre chose et j’ai provoqué un intent pour retourner sur le MainActivity après la sélection du filtre et miracle ma liste s’est mise à jour :smiley:
Je vais en parler ce soir au coatching Android pour avoir quelque éclaircissement de Maxime.
Merci pour ton aide

#8

Hello,

Il ne faut pas oublier avant cela de refaire refresh de la liste car elle a changé entre temps et, pour prendre en compte ta nouvelle entrée quand tu reviens d’un autre intent, ça ne se fait pas automatiquement :slight_smile:

#9

Hello schtipoun,

Suite au coatching Android, j’ai réadapté mon code selon les conseils de Maxime.

L’intent de retour déclenchait une nouvelle activité et ne rebranchait pas sur la première. Et donc les données étaient forcément rafraîchies … Mais point de vue performance c’était pas terrible.

Du coup, après la sélection du filtre, j’ai rajouté un finish() pour fermer l’activité de filtre et revenir automatiquement sur le MainActivity de départ.

Dans le MainActivity, j’ai extériorisé la déclaration de mon adapter et j’ai enrichi la fonction OnResume. Ensuite, j’ai ajouté une fonction de filtre dans l’adapter et une fonction de reload où j’utilise le notifyDataSetChanged .

image

Ca m’aura pris une plombe mais ça marche à merveille maintenant !!

Merci beaucoup pour ton aide !!

1 Like
#10

C’est bien là l’essentiel :slight_smile: