2012-08-05 88 views
3

後,我有一個ListView,顯示的從表中SQLiteDatabase採取ArrayAdapter筆記的列表。刷新的ListView與ArrayAdapter編輯項

public class NotepadActivity extends ListActivity { 

protected static final int ADD_NEW_NOTE = 0; 
protected static final int EDIT_NOTE = 1; 
ArrayAdapter<Note> adapter; 
NotesManager manager; 
private Note nNoteToDelete; 
ArrayList<Note> lstAllNotes; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    findViewById(R.id.btnAddNewNote).setOnClickListener(addNewNote); 
    manager = new NotesManager(this); 
    lstAllNotes = manager.getAllNotes(); 
    adapter = new ArrayAdapter<Note>(this, R.layout.note, lstAllNotes); 
    setListAdapter(adapter); 
    getListView().setOnItemClickListener(editNote); 
    registerForContextMenu(getListView()); 
} 

當我點擊這個ListView的一個項目,它需要這個注意對象的EditNote活動:

private OnItemClickListener editNote = new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     Note currNote = (Note)parent.getItemAtPosition(position); 

     int curr_note_id = currNote.getId(); 
     String curr_note_title = currNote.getTitle().toString(); 
     String curr_note_details = currNote.getDetails().toString(); 

     Intent editNote = new Intent(NotepadActivity.this, EditNote.class); 
     editNote.putExtra("CURR_NOTE_ID", curr_note_id); 
     editNote.putExtra("CURR_NOTE_TITLE", curr_note_title); 
     editNote.putExtra("CURR_NOTE_DETAILS", curr_note_details); 

     startActivityForResult(editNote, EDIT_NOTE); 

    } 
}; 

我可以在那裏和內容編輯註釋的標題。當我打的保存按鈕,它發回的主要活動標題的字符串和詳細信息和ID INT:

public class EditNote extends Activity implements OnClickListener { 

int curr_note_id; 
String curr_note_title; 
String curr_note_details; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.editnote); 

    curr_note_id = getIntent().getExtras().getInt("CURR_NOTE_ID"); 
    curr_note_title = getIntent().getExtras().getString("CURR_NOTE_TITLE"); 
    curr_note_details = getIntent().getExtras().getString(
      "CURR_NOTE_DETAILS"); 

    ((EditText) findViewById(R.id.edtTitle)).setText(curr_note_title); 
    ((EditText) findViewById(R.id.edtDetails)).setText(curr_note_details); 

    findViewById(R.id.btnSave).setOnClickListener(this); 
    findViewById(R.id.btnCancel).setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 

    switch (v.getId()) { 
    case R.id.btnSave: 
     String strNoteTitle = ((EditText) findViewById(R.id.edtTitle)).getText().toString().trim(); 
     String strNoteDetails = ((EditText) findViewById(R.id.edtDetails)).getText().toString().trim(); 

     if (!strNoteTitle.equals("")) { 

      Intent data = new Intent(); 
      data.putExtra("NOTE_ID", curr_note_id); 
      data.putExtra("NOTE_TITLE", strNoteTitle); 
      data.putExtra("NOTE_DETAILS", strNoteDetails); 
      setResult(RESULT_OK, data); 
      finish(); 
     } else { 
      ((EditText) findViewById(R.id.edtTitle)) 
        .setError("A note must contain a title"); 
     } 

     break; 
    case R.id.btnCancel: 
     setResult(RESULT_CANCELED); 
     finish(); 
     break; 
    } 

} 

}

,並在主活動,應該更新數據庫和帶有新標題的ListView,如果有更改。我的代碼確實更新了數據庫,但是我沒有立即在ListView中看到更改,只有當我退出應用程序並再次打開它時纔會發生。下面的代碼(看第二種情況下,EDIT_NOTE):

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
     case ADD_NEW_NOTE: 
      String noteTitle = data.getExtras().getString("NOTE_TITLE"); 
      String noteDetails = data.getExtras().getString("NOTE_DETAILS"); 
      Note nNewNote = new Note(-1, noteTitle, noteDetails); 
      adapter.add(nNewNote); 
      manager.addNote(nNewNote); 
      break; 
     case EDIT_NOTE: 
      int noteID = data.getExtras().getInt("NOTE_ID"); 
      noteTitle = data.getExtras().getString("NOTE_TITLE"); 
      noteDetails = data.getExtras().getString("NOTE_DETAILS"); 
      nNewNote = new Note(noteID, noteTitle, noteDetails); 
      Toast.makeText(NotepadActivity.this, noteTitle + "\n" + noteDetails, Toast.LENGTH_SHORT).show(); 
      manager.updateNote(nNewNote);   
      break; 
     } 

    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

後manager.updateNote(nNewNote);我試圖使用adapter.notifyDataSetChanged();但沒有奏效 - 我沒有看到ListView中的更改。也許我用錯了,也許我應該用別的東西...

那麼我怎樣才能使ListView刷新?如何在不重新啓動應用程序的情況下立即看到變化?

謝謝!

+0

我有一個問題,在單擊列表項時調用'onActivityResults',而不是等待打開的活動首先完成 – Pierre 2015-03-08 18:18:15

回答

3

當您從編輯活動返回時,再次設置列表適配器以刷新ListView。如果您想查看任何更新,您必須每次手動刷新ListView。希望這可以幫助。

+0

嘗試像這樣'manager.updateNote(nNewNote); \t \t \t \t適配器=新ArrayAdapter (這一點,R.layout.note,lstAllNotes);',但它仍然沒有工作,仍然沒有刷新... – Igal 2012-08-05 09:01:30

+3

沒有,你要'setListadapter()'又像你在'onCreate()'方法中做了。 使填充ListView和調用它在你的活動'onResume'方法的新方法。這樣,每次你回到你的活動時它都會刷新。 – 2012-08-05 09:04:01

+0

是的,現在它工作了!非常感謝你!!! :) – Igal 2012-08-05 09:15:37