2010-04-19 21 views
0

我正在寫一個黑莓應用程序。我有一個自定義列表字段,我可以在列表中選擇一個項目,將編輯屏幕推入堆棧。我編輯該項目並保存,當我彈出該屏幕以便返回到列表屏幕上時,我想查看我剛剛在列表中顯示的更新。我已經在其他只有LabelField的屏幕上完成了這項工作,並且工作正常。但是,在列表屏幕中,調用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); 
    } 
} 

回答

3

在上面的代碼中是否存在拼寫錯誤?在updateTaskList方法,你這樣做:

taskListField= new TaskListField(incompletetTasks, t); 

它應該是:

taskListField= new CustomListField(incompletetTasks, t); 

無論如何,我認爲你有問題,其原因是因爲當你更新你的任務列表中,您實際上是創建一個新的CustomListField目的。當你第一次添加(taskListField)時,你將一個對字段的引用傳遞給屏幕,所以它有它自己的引用。當你調用taskListField = new CustomListField(incompletetTasks,t);你只更新自己的參考,而不是屏幕上的參考。所以如果你調用無效屏幕將使用原始引用進行重繪,原始引用必須使用對incompleteTasks和任務的原始版本的引用。

它以另一種方式工作的原因是因爲您實際上刪除了舊的引用並添加了新的引用,因此屏幕現在知道更新的數據。

你應該做的是向你的CustomListField添加一個方法,允許你更新任務列表對象。然後,當您在對taskListField的現有引用上調用該方法,然後調用invalidate時,您的paint方法現在應該在回調中調用drawListRow時使用新值。

+0

是的,那是一個錯字,對不起。這對於列表字段的引用完全有意義。謝謝!現在就試試看。 – Michaela 2010-04-20 14:24:08

0

添加項目和更新列表:

  • 添加物品到陣列的列表項/向量
  • 執行插入新行(listField.insert(listField.getSize());)