【问题标题】:Blackberry invalidate field not causing a repaint黑莓无效字段不会导致重绘
【发布时间】:2010-04-20 18:05:16
【问题描述】:

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

【问题讨论】:

    标签: user-interface blackberry invalidation listfield


    【解决方案1】:

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

    taskListField= new TaskListField(incompletetTasks, t);
    

    应该是:

    taskListField= new CustomListField(incompletetTasks, t);
    

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

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

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

    【讨论】:

    • 是的,这是一个错字,抱歉。这对于对列表字段的引用是完全有意义的。谢谢!现在就去试一试。
    【解决方案2】:

    添加项目和更新列表:

    • 将项目添加到列表项的数组/向量中
    • 执行插入新行 (listField.insert(listField.getSize());)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多