2012-02-23 7 views
0

내 앱에 언젠가는이 "문제"가 있었으며 항상 문제가 있다는 것을 이해하지 못했지만 지금까지 왜 그런지 묻지 않았습니다.왜 맞춤 CursorAdapter로 관리되는 ListView가 새로운 데이터로 자동으로 새로 고침됩니까?

각 목록 항목에 대한 사용자 지정 레이아웃이있는 ListView (ListActivity을 통해 구현 됨)이 있습니다. 그걸로 나는 모든 목록 항목 요소 (newView 및 을 오버라이드하고 ViewHolder 패턴은 이와 같은 작업을 수행 할 때 이미 보장 된 사용자 정의 CursorAdapter)을 가지고 있습니다 (필요한 경우 https://codereview.stackexchange.com/q/1057 참조).

이것은 주요 활동이며 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); 
    } 

} 

P.S : 나는 CursorLoader에 대해 알고 있으며 로드맵에 뭔가하지만 나는 그런 코드가 당분간 재 작성을 처리 할 시간이 없습니다. 내가 너 한테 알려줄 줄 알았어. 현재로서는 현재 코드가 어떻게되는지 알 필요가 있습니다.

+0

주요'ListActivity' 또는 적어도 onCreate 메소드에 대한 코드를 게시하십시오. – Luksprog

+0

관련 코드가 업데이트되었습니다. –

+0

답변으로 게시 할 가치는 없지만 onActivityResult()에서 initializeNotesListAdapter() 클래스를 호출 할 수는 있습니다. 최종 솔루션 (사용자에게 짜증나게 할 수있는 ListView의 위치를 ​​다시 설정 함)로 사용되지는 않지만 적어도이 목록에 새 항목이 추가되는지 확인하는 데 도움이 될 수 있습니다. – JMRboosties

답변

1

startManagingCursor()으로 전화하면 활동이 중지되면 Cursor이 비활성화되고 활동이 다시 시작될 때 Cursor이 다시 요청됨을 의미합니다.

onActivityResult에서 cursor.requery()를 강제 실행해야합니까?

관리되는 Cursor에 대해 자동으로 발생합니다.

+0

'startManagingCursor'처럼 뭔가 빠져 있다는 것을 알았습니다. 커서를 다시 쿼리하지 않는 이유가 궁금합니다. 그러나 실제로는 매우 드물게 발생합니다. 드물게 그 문제에 대해 잊어 버렸습니다. 다른 방법으로 보았을 때까지는 그 문제가 더 이상 발생하지 않았습니다. 아마 그것이 진짜 문제가 될 때까지, 나는 그것을 잊어 버려야 할 것입니다. –

관련 문제