私は自分のアプリでこの「問題」をしばらく抱えていましたが、その動作が理解できなかったのでいつも気になりましたが、今まで理由を尋ねることはありませんでした。
リストアイテムごとにカスタムレイアウトのListView
(を介して実装)があります。これで、すべてのリストアイテム要素を適切に入力ListActivity
する習慣があります(オーバーライドして、このように行うと、ViewHolderパターンがすでに保証されています。必要に応じてhttps://codereview.stackexchange.com/q/1057を参照してください)。CursorAdapter
newView
bindView
これはメインのアクティビティであり、のコンテンツを更新しListView
たり、新しいアイテムを作成したり、現在のアイテムを編集したりできる2つのアクションがあります。どちらの場合も、同じアクティビティが使用されます(アクションのタイプに適応します)。次のようになります。
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_EDIT);
アクションタイプを実際に区別するのはインテントの内容でありrequestCode
、サブアクティビティでは無視されます。
さて、ドキュメントには上記の方法について次のように書かれています:
このアクティビティが終了すると、onActivityResult()メソッドが指定されたrequestCodeで呼び出されます。
しかし、私は使用していませんonActivityResult
。実際、サブアクティビティが存在する場合(作成モードまたは編集モードのいずれか)は何もしていません。そして、私がこれまでに気づいた振る舞いはこれです:
- 作成:メインアクティビティに戻るたびに、
ListView
は新しいアイテムで自動的に更新されます。ただし、まれに、ListView
に新しいアイテムが入力されない場合があります。メインアクティビティ(たとえば、アプリを終了する)を破棄して再作成する必要があります。そうすると、新しいアイテムがそこに表示されます。 - 編集:作成アクションについて説明したのと同様の動作に気づいたことはありません。これまでのところ、
ListView
は常に新しいコンテンツの変更で自動的に更新されていました。
私の質問は、コンテンツへの変更を電話したり手動で通知したりしないListView
ときに、コンテンツを自動的に更新するようにする舞台裏で何が起こっているのかということです。cursor.requery()
そして、なぜそれはいつもうまくいかないのですか?
多分私はcursor.requery()
自分自身を強制する必要がありonActivityResult
ますか?
public class MainActivity extends ListActivity {
private static final int ACTIVITY_NOTE_EDITOR_CREATE = 0;
private NotificationHelper mNotificationHelper;
private AgendaNotesAdapter mAgendaAdapter;
private Cursor mAllNotesCursor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNotificationHelper = Program.getNotificationHelper();
mAgendaAdapter = new AgendaNotesAdapter(this);
mAgendaAdapter.open();
initializeNotesListActivity();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
switch(item.getItemId()) {
case R.id.actionbar_item_new_note:
intent = NoteEditorMainActivity.createIntent(this);
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
return true;
}
return false;
}
private void initializeNotesListActivity() {
mAllNotesCursor = mAgendaAdapter.fetchAllNotes();
startManagingCursor(mAllNotesCursor);
NotesListAdapter notesAdapter = new NotesListAdapter(this, mAllNotesCursor,
mNotificationHelper, mAgendaAdapter);
setListAdapter(notesAdapter);
}
}
PS:CursorLoaderについては知っていて、ロードマップにあるものですが、当面はそのようなコードの書き直しに対処する時間がありません。私があなたに知らせたいと思っただけです。今のところ、現在のコードで何が起こっているのかを知る必要があります。