2

更新されたデータが表示されているときに現在のAndroidビューを取得し、強制的に再描画するにはどうすればよいですか?私はAndroidのメモ帳チュートリアルを実行し、レッスン3を問題なく完了しました。結局のところ、解決策は提供されていますが、最初の重要な変更に固執しています。

メニューの[メモの追加]ボタンの横に新しいボタンを追加しました。このボタンを押すと、システム内の各ノートのタイトルに文字が追加されます。ただし、どれだけ待っても、新しいタイトルはメモのリストに表示されません。アプリを閉じて元に戻すと変更表示されるため、アップデーターが機能することはわかっています。

これまでのところ、プログラムを新しい値で再描画するには、ある種の無効化メソッドを使用する必要があることを発見しました。これinvalidate()はUIスレッドから使​​用され、UIpostInvalidate()以外のスレッド1、2から使用されていることは知っていますが、どのスレッドにいるのかさえわかりません。また、これらのメソッドは両方とも、View必要なオブジェクトから呼び出す必要があります。描画していて、そのオブジェクトを取得する方法がわかりません。私が試みるすべては戻りますnull

私のメインクラス:

public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
        case INSERT_ID:
            createNote();
            return true;
        case NEW_BUTTON:
            expandTitles();
            return true;
        default:
            // Intentionally empty
    }
    return super.onMenuItemSelected(featureId, item);
}

private void expandTitles() {
    View noteListView = null;

    // noteListView = findViewById(R.layout.notes_list); // null

    // noteListView =
    //   getWindow().getDecorView().findViewById(android.R.id.content);
    // From SO question 4486034

    noteListView = findViewById(R.id.body); // Fails

    mDbHelper.expandNoteTitles(noteListView);
}

私のDAOクラス:

public void expandNoteTitles(View noteListView) {
    Cursor notes = fetchAllNotes();
    for(int i = 1; i <= notes.getCount(); i++) {
        expandNoteTitle(i);
    }

    // NPE here when attempt to redraw is not commented out
    noteListView.invalidate(); // Analogous to AWT's repaint(). Not working.
    // noteListView.postInvalidate(); // Like repaint(). Not working.
}

public void expandNoteTitle(int i) {
    Cursor note = fetchNote(i);
    long rowId =
      note.getLong(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_ROWID));
    String title =
      note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)) + "W";
    String body =
      note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY));
    updateNote(rowId, title, body);
}

ボタンを押すとすぐに更新されたノートのタイトルが表示されるようにするにはどうすればよいですか?

明らかに、私はAndroidの完全な初心者です。私はあなたが小さな言葉を使って、明白なことさえ説明することを奨励するためにこれを指摘します。これが100万回目の「Androidが再描画されない」質問であることは知っていますが、既存の投稿を何十も読んだことがあり、それらは当てはまらないか、意味がありません。

1:postInvalidate()は何をしますか?
2:Androidのinvalidate()メソッドとpostInvalidate()メソッドの違いは何ですか?

4

1 に答える 1

1

チュートリアルによると、既存のメモのリストはListViewに表示されます。これはアダプタベースのビューであるため、表示されるアイテムは、BaseAdapterクラスを拡張するアダプタから供給されます。このような場合は、notifyDatasetChangedメソッドを呼び出して、内容が変更されたことをアダプターに通知する必要があります。これは、ListViewにその行を更新して再描画するように通知します。

編集:

申し訳ありませんが、この例ではCursorAdaptersを使用していることに気付きました。これらは、データベースクエリから取得されたCursorオブジェクトから表示するアイテムを調達します。ここで、notifyDatasetChanged()がアダプターに通知するのは、アダプターをサポートするデータが変更されたため、このアダプターに基づくものを表示するビューは、その内容を再描画する必要があるということです。CursorAdapterの場合、このデータはカーソルから取得されます。したがって、次のように、そのカーソルを再クエリして、DBから更新する必要もあります。

private void expandTitles() {
        mDbHelper.expandNoteTitles();

        CursorAdapter adapter = (CursorAdapter)getListAdapter();
        adapter.getCursor().requery();
    }

この場合、requery()メソッドはnotifyDatasetChanged()を自動的に呼び出すため、心配する必要はありません。リストは自動的に更新されます。このスレッドも参照してください:https ://groups.google.com/forum/?fromgroups#!topic / android-developers / _FrDcy0KC-w%5B1-25%5D 。

于 2012-08-11T06:12:41.377 に答える