0

私は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);
    }
}
4

2 に答える 2

3

上記のコードにタイプミスはありますか?updateTaskListメソッドでは、次のようにします。

taskListField= new TaskListField(incompletetTasks, t);

それは次のようになります:

taskListField= new CustomListField(incompletetTasks, t);

とにかく、問題が発生している理由は、タスクリストを更新するときに、実際に新しいCustomListFieldオブジェクトを作成しているためだと思います。最初にadd(taskListField)を実行すると、フィールドへの参照が画面に渡されるため、独自の参照があります。taskListField = new CustomListField(incompletetTasks、t);を呼び出すとき。画面内の参照ではなく、独自の参照を更新するだけです。したがって、invalidateを呼び出すと、元の参照を使用して画面が再描画されます。元の参照は、incompleteTasksとタスクの元のバージョンへの参照も使用している必要があります。

これが逆に機能する理由は、実際に古い参照を削除して新しい参照を追加しているため、画面が更新されたデータを認識しているためです。

あなたがすべきことは、タスクリストオブジェクトを更新できるようにするメソッドをCustomListFieldに追加することです。次に、taskListFieldへの既存の参照でそのメソッドを呼び出してからinvalidateを呼び出すと、paintメソッドはコールバックでdrawListRowを呼び出すときに新しい値を使用する必要があります。

于 2010-04-20T10:05:16.220 に答える
0

アイテムを追加してリストを更新するには:

  • リスト項目の配列/ベクトルに項目を追加
  • 新しい行の挿入を実行します (listField.insert(listField.getSize());)
于 2010-04-20T05:16:18.920 に答える