android - 编辑项目后使用 ArrayAdapter 刷新 ListView

标签 android listview android-arrayadapter

我有一个 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 Activity 中:

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 发送回主 Activity :

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;
    }

}

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

谢谢!

最佳答案

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

关于android - 编辑项目后使用 ArrayAdapter 刷新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815109/

相关文章:

android - 使用 RxJava for Android 重试 observable 直到满足某些条件

java - Android:对 arrayList 中的名称列表进行排序并将它们链接到适当的 ID

java - Android ListView 问题

android - notifyDataSetChanged() 未通过 ArrayAdapter() 更新 DataGrid()

android - 为什么Activity重启后ArrayAdapter无法更新listview?

java - 如何在 ArrayAdapter 上设置父背景

android - 在 Android 中使用外部库运行 JavaFX 应用程序?

Android/Eclipse - 查找未使用的文件 (Java/XML)

java - 图像和字符串数组的 ListView 不起作用

android - 在 Android 应用程序的 ListView 下添加包含 2 个按钮的布局