3

我有一个 ListView,它使用 ArrayAdapter 显示从 SQLiteDatabase 中的表中获取的注释列表。

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 中的一个项目时,它会将这个 Note 对象带到 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;
    }

}

}

并且在主要活动中,如果有更改,它应该使用新标题更新 DB 和 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 刷新呢?如何在不重新启动应用程序的情况下立即看到更改?

谢谢!

4

1 回答 1

3

当您从编辑活动返回时,再次设置列表适配器以刷新 ListView。如果您想查看任何更新,则必须每次手动刷新 ListView。希望这可以帮助。

于 2012-08-05T08:53:04.177 回答