我正在写一个Blackberry应用程序。我有一个自定义列表字段,我可以在列表中选择一个项目,将编辑屏幕推到堆栈上。我编辑项目并保存,当我弹出该屏幕以便我回到列表屏幕上时,我想查看刚刚在列表中反映的更新。我已经在其他只有LabelFields的屏幕上完成了这项工作,并且工作正常。但是,使用列表屏幕,调用invalidate()似乎什么都不做。我知道通过打印行正确保存了值,我看到listfield中的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);
}
}
答案 0 :(得分:3)
上面的代码中是否有拼写错误?在updateTaskList方法中你可以:
taskListField= new TaskListField(incompletetTasks, t);
应该是:
taskListField= new CustomListField(incompletetTasks, t);
无论如何,我认为您遇到问题的原因是因为当您更新任务列表时,实际上是在创建一个新的CustomListField对象。当您第一次添加(taskListField)时,您将对该字段的引用传递给屏幕,因此它有自己的引用。当你调用taskListField = new CustomListField(incompletetTasks,t)时;您只是更新自己的参考,而不是屏幕中的参考。因此,如果您调用invalidate,屏幕将使用原始引用重新绘制,原始引用必须使用对incompleteTasks和tasks的原始版本的引用。
它以另一种方式工作的原因是因为你实际上是删除旧引用并添加新引用,所以屏幕现在知道更新的数据。
您应该做的是向CustomListField添加一个方法,允许您更新任务列表对象。然后,当您在对taskListField的现有引用上调用该方法然后调用invalidate时,您的paint方法现在应该在回调中调用drawListRow时使用新值。
答案 1 :(得分:0)
添加项目和更新列表: