0

私は自分のアプリでこの「問題」をしばらく抱えていましたが、その動作が理解できなかったのでいつも気になりましたが、今まで理由を尋ねることはありませんでした。

リストアイテムごとにカスタムレイアウトのListView(を介して実装)があります。これで、すべてのリストアイテム要素を適切に入力ListActivityする習慣があります(オーバーライドして、このように行うと、ViewHolderパターンがすでに保証されています。必要に応じてhttps://codereview.stackexchange.com/q/1057を参照してください)。CursorAdapternewViewbindView

これはメインのアクティビティであり、のコンテンツを更新し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については知っていて、ロードマップにあるものですが、当面はそのようなコードの書き直しに対処する時間がありません。私があなたに知らせたいと思っただけです。今のところ、現在のコードで何が起こっているのかを知る必要があります。

4

1 に答える 1

1

の呼び出しstartManagingCursor()は、アクティビティが停止すると、Cursorが非アクティブ化され、アクティビティが再開されると、が再Cursorクエリされることを意味します。

onActivityResultでcursor.requery()を自分で強制する必要がありますか?

これは、管理対象に対して自動的に発生するはずCursorです。

于 2012-02-23T16:25:12.003 に答える