2010-04-19 5 views
0

J'écris une application Blackberry. J'ai un champ de liste personnalisé où je peux sélectionner un élément dans la liste qui pousse l'écran d'édition sur la pile. J'édite l'article et le sauvegarde, et quand j'éteins cet écran pour que je revienne sur l'écran de ma liste, je veux voir la mise à jour que je viens de faire apparaître dans la liste. Je l'ai fait sur d'autres écrans qui avaient juste LabelFields et ça a bien fonctionné. Cependant, avec l'écran de liste, appeler invalidate() semble ne rien faire. Je sais que la valeur a été sauvegardée correctement via les lignes d'impression, et je vois que la méthode paint() dans le champ liste est appelée. Mais la seule façon de mettre à jour le champ liste est de le supprimer de l'écran et de le rajouter. Cela semble faux. Qu'est-ce que je fais mal?Blackberry invalider le champ ne provoque pas de repeindre

public class ListTasksScreen extends MainScreen{  
    private TaskList tasks; 
    private CustomListField taskListField; 

    public ListTasksScreen (TaskList tasks){ 
     super(); 
     this.tasks = tasks;  
     Vector incompleteTasks = tasks.getIncompleteTasks(); 
     taskListField = new CustomListField(incompleteTasks, tasks); 
     add(taskListField);  
    } 

    public void updateTaskList(TaskList t) 
    { 
     Vector incompleteTasks = t.getIncompleteTasks(); 
     taskListField= new TaskListField(incompletetTasks, t); 
      //I just want to call taskListField.invalidate() here. 
      //the only thing that seems to work is deleting taskListField 
      //and re-adding 
      this.delete(taskListField); 
     add(taskListField); 
    } 
} 

Répondre

3

Y at-il une faute de frappe dans votre code ci-dessus? dans la méthode updateTaskList vous:

taskListField= new TaskListField(incompletetTasks, t); 

devrait-il:

taskListField= new CustomListField(incompletetTasks, t); 

Quoi qu'il en soit, je pense que la raison pour laquelle vous avez des problèmes parce que lorsque vous mettez à jour votre liste de tâches que vous créez en fait une nouvelle CustomListField objet. Lorsque vous ajoutez add (taskListField) pour la première fois, vous passez une référence au champ à l'écran, donc il a sa propre référence. Lorsque vous appelez taskListField = new CustomListField (incompletetTasks, t); vous mettez à jour votre propre référence, pas celle de l'écran. Donc, si vous appelez invalide, l'écran sera repeint en utilisant la référence d'origine, qui doit également utiliser des références aux versions d'origine de incompleteTasks et des tâches.

La raison pour laquelle cela fonctionne dans l'autre sens est parce que vous supprimez en fait l'ancienne référence et en ajoutant la nouvelle, de sorte que l'écran sait maintenant des données mises à jour.

Ce que vous devez faire est d'ajouter une méthode à votre CustomListField qui vous permet de mettre à jour l'objet de la liste des tâches. Ensuite, lorsque vous appelez cette méthode sur la référence existante à taskListField, puis appelez invalidate, votre méthode de peinture doit maintenant utiliser les nouvelles valeurs lorsqu'elle appelle drawListRow dans le rappel.

+0

Oui, c'était une faute de frappe, désolé. Cela prend tout son sens à propos de la référence au champ liste. Je vous remercie! Je vais essayer maintenant. – Michaela

0

pour ajouter la liste des objets et la mise à jour:

  • ajouter l'article à matrice/vecteur d'éléments de liste
  • effectuer insérer une nouvelle rangée (listField.insert (listField.getSize());)
Questions connexes