0

我正在编写一个黑莓应用程序。我有一个自定义列表字段,我可以在其中选择列表中的一个项目,将编辑屏幕推送到堆栈上。我编辑该项目并保存,当我弹出该屏幕以返回我的列表屏幕时,我想查看我刚刚在列表中反映的更新。我已经在其他只有 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);
    }
}
4

2 回答 2

3

上面的代码中有错字吗?在您执行的 updateTaskList 方法中:

taskListField= new TaskListField(incompletetTasks, t);

应该是:

taskListField= new CustomListField(incompletetTasks, t);

无论如何,我认为您遇到问题的原因是因为当您更新任务列表时,您实际上是在创建一个新的 CustomListField 对象。当您第一次执行 add(taskListField) 时,您会将对该字段的引用传递给屏幕,因此它有自己的引用。当您调用 taskListField= new CustomListField(incompletetTasks, t); 您只是在更新自己的参考,而不是屏幕上的参考。因此,如果您调用 invalidate,屏幕将使用原始引用重新绘制,这也必须使用对未完成任务和任务的原始版本的引用。

它以另一种方式工作的原因是因为您实际上是在删除旧引用并添加新引用,因此屏幕现在知道更新的数据。

您应该做的是向您的 CustomListField 添加一个方法,该方法允许您更新任务列表对象。然后,当您在对 taskListField 的现有引用上调用该方法并调用 invalidate 时,您的绘制方法现在应该在回调中调用 drawListRow 时使用新值。

于 2010-04-20T10:05:16.220 回答
0

添加项目和更新列表:

  • 将项目添加到列表项的数组/向量
  • 执行插入新行 (listField.insert(listField.getSize());)
于 2010-04-20T05:16:18.920 回答