Поле недействительности Blackberry не вызывает перерисовку - PullRequest
0 голосов
/ 20 апреля 2010

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

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

Ответы [ 2 ]

3 голосов
/ 20 апреля 2010

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

taskListField= new TaskListField(incompletetTasks, t);

должно быть:

taskListField= new CustomListField(incompletetTasks, t);

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

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

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

0 голосов
/ 20 апреля 2010

для добавления элемента и обновления списка:

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