2010-04-19 4 views
0

Я пишу приложение Blackberry. У меня есть собственное поле списка, в котором я могу выбрать элемент в списке, который подталкивает экран редактирования к стеку. Я редактирую элемент и сохраняю его, и когда я выхожу из этого экрана, поэтому снова вернусь на экран списка, я хочу просмотреть обновленное мной обновление, отраженное в списке. Я сделал это на других экранах, у которых был только LabelFields, и он работал нормально. Однако со списком экрана вызов invalidate(), кажется, ничего не делает. Я знаю, что значение правильно сохранялось с помощью строк печати, и я вижу, что метод paint() в поле списка вызывает вызов. Но единственным способом получить поле списка для обновления является удаление его с экрана и его повторное добавление. Это кажется неправильным. Что я делаю не так?Blackberry invalidate поле не вызывает перекраску

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

ответ

3

Есть ли опечатка в вашем коде выше? в методе updateTaskList вы делаете:

taskListField= new TaskListField(incompletetTasks, t); 

должен быть:

taskListField= new CustomListField(incompletetTasks, t); 

Во всяком случае, я думаю, что причина у вас возникли проблемы, потому что при обновлении списка задач вы фактически создаете новый CustomListField объект. Когда вы сначала добавляете (taskListField), вы передаете ссылку на поле на экран, поэтому у него есть своя ссылка. Когда вы вызываете taskListField = new CustomListField (incompletetTasks, t); вы только обновляете свою собственную ссылку, а не та, что на экране. Поэтому, если вы вызываете invalidate, экран будет перерисовываться с использованием исходной ссылки, в которой также должны использоваться ссылки на исходные версии неполных задач и задач.

Причина, по которой это работает, заключается в том, что вы фактически удаляете старую ссылку и добавляете новую, поэтому экран теперь знает об обновленных данных.

Что вам нужно сделать, это добавить метод на свой CustomListField, который позволит вам обновить объект списка задач. Затем, когда вы вызываете этот метод в существующей ссылке на taskListField, а затем вызываете invalidate, ваш метод рисования теперь должен использовать новые значения, когда он вызывает drawListRow в обратном вызове.

+0

Да, это была опечатка, извините. Это дает полное представление о ссылке на поле списка. Спасибо! Идти, чтобы попробовать это сейчас. – Michaela

0

добавить пункт и обновления списка:

  • добавить элемент в массив/вектор элементов списка
  • выполнения вставки новой строки (listField.insert (listField.getSize());)