更新されたデータが表示されているときに現在の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()メソッドの違いは何ですか?