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