Почему мой ListView, управляемый пользовательским CursorAdapter, автоматически обновляется новыми данными? - PullRequest
0 голосов
/ 23 февраля 2012

У меня какое-то время возникала эта «проблема» в моем приложении, и меня всегда беспокоило, что я не понимаю его поведение, но никогда не заботился о том, почему, до сих пор.

У меня есть ListView (реализовано через ListActivity) с пользовательским макетом для каждого элемента списка.При этом у меня есть пользовательский CursorAdapter для правильного заполнения всех элементов элемента списка (с переопределением newView и bindView, шаблон ViewHolder уже гарантирован, когда вы делаете это следующим образом, при необходимости обращайтесь к: https://codereview.stackexchange.com/q/1057).

Это основное действие, и есть 2 действия, которые могут обновлять содержимое ListView, создавать новый элемент или редактировать текущий.В обоих случаях используется одно и то же действие (которое приспосабливается к типу действия), что-то вроде этого:

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, и эточто-то в планах, но у меня нет времени, чтобы иметь дело с таким переписыванием кода в настоящее время.Просто подумал, что дам тебе знать.Сейчас мне просто нужно знать, что происходит с моим текущим кодом.

1 Ответ

1 голос
/ 23 февраля 2012

Ваш звонок на startManagingCursor() означает, что когда действие прекращается, Cursor деактивируется, а когда действие возобновляется, запрашивается Cursor.

Должен ли я сам принудительно установить cursor.requery () на onActivityResult?

Это должно произойти автоматически для вашего управляемого Cursor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...