13 37 Update List View

À la fin de la dernière vidéo, des erreurs sont apparues lors de la création d'un nouveau TodoItem. Le problème vient d'une casse mal gérée : dans le FXML todoItemDialog, les fx:id commencent par une minuscule (par exemple detailsArea et deadlinePicker), or dans le DialogController, ces noms étaient déclarés avec une majuscule initiale. Nous corrigeons les déclarations Java pour qu'elles correspondent exactement aux identifiants FXML.

Rafraîchir la ListView

Après cette correction, le dialogue s'ouvre normalement. On peut saisir une description, des détails et une date puis cliquer sur OK : la console affiche bien "Button OK", et le fichier est mis à jour. Mais le nouvel élément n'apparaît pas immédiatement dans la ListView : il faut redémarrer l'application pour le voir. La liste n'est donc pas synchronisée automatiquement avec les modifications du modèle.

Une solution propre à base de data binding viendra plus tard. Pour l'instant, nous forçons explicitement la mise à jour de la ListView après l'ajout. Dans le Controller principal, juste après controller.processResults(), nous écrivons todoListView.getItems().setAll(TodoData.getInstance().getTodoItems()). Cela remplace le contenu de la vue par la liste à jour issue du Singleton.

Au prochain lancement, créer un nouvel élément l'ajoute désormais immédiatement à la ListView sans avoir à redémarrer. Ce mécanisme reste un correctif temporaire : dans la suite, nous verrons comment utiliser le data binding et une liste observable pour que la ListView reflète automatiquement les changements du modèle.

En résumé

Cette leçon explique comment résoudre le problème où les nouveaux éléments à faire ne s'affichent pas automatiquement dans le ListView après leur création, même s'ils sont correctement sauvegardés. La solution présentée consiste à mettre à jour explicitement le ListView en appelant la méthode setAll() avec les données actuelles du singleton, afin de synchroniser l'affichage avec les données persistantes.

Points clés

  • Le ListView ne se met pas à jour automatiquement quand de nouveaux éléments sont ajoutés, même s'ils sont sauvegardés en base de données
  • La solution est d'appeler todoListView.getItems().setAll(todoData.getInstance().getTodoItems()) après avoir ajouté un élément
  • Cette approche recharge entièrement le contenu de la liste avec les données du singleton, ce qui synchronise l'affichage avec le modèle
  • Il est important de corriger les incohérences de casing dans le contrôleur de dialogue (champs détails et date)
  • Une solution plus automatique existe mais sera abordée dans les prochaines vidéos

Questions fréquentes

Pourquoi le nouvel élément n'apparaît-il pas dans la liste après sa création ?

Parce que le ListView ne se met pas automatiquement à jour quand les données changent. L'élément est bien sauvegardé (il réapparaît après redémarrage de l'application), mais l'interface graphique doit être rafraîchie explicitement pour refléter ces changements.

Comment mettre à jour le ListView pour afficher les nouveaux éléments ?

En appelant todoListView.getItems().setAll(todoData.getInstance().getTodoItems()) immédiatement après avoir ajouté un nouvel élément. Cette méthode recharge toute la liste avec les données actuelles du singleton et affiche les changements à l'écran.

Quelle est la meilleure pratique à long terme ?

La méthode de rafraîchissement explicite presentée ici est une solution rapide et fonctionnelle. Une approche plus automatique et élégante sera traitée dans les prochaines vidéos, probablement en utilisant les observables ou les listeners de Java.