无法从其他类刷新listView

时间:2014-11-19 15:36:32

标签: android android-listview android-adapter android-dialogfragment

在我的主片段中,我有一个名为notesListView的listView。 noteAdapter填充notesListView。当用户长时间点击其中一个notesListView元素时,会出现一个对话框,询问用户是否确实要删除某个项目。如果他同意,那么该项目将从数据库中删除。如果没有 - 那么生活还在继续。

问题是我的Dialog是其他类(其他片段)。对于这个类,我也传递了我的database对象和noteAdapter对象,因此它可以从数据库中删除项目,然后通知noteAdapter数据已更改。听起来不错,但它不起作用,我完全不知道为什么。请看看并帮助我。

这是mainFragment中的一个方法,它处理上面提到的listView:

public void handleNotes(final ListView notesListView){

if (database.getNoteCount() != 0) {
    notesListView.setAdapter(noteAdapter);

    notesListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView textViewId = (TextView) view.findViewById(R.id.textViewId);

            DeleteNoteFragment newFragment = new DeleteNoteFragment(database, noteAdapter, Integer.parseInt(textViewId.getText().toString()));
            newFragment.show(getActivity().getSupportFragmentManager(), "deleteConfirmation");

            return false;
        }
    });
}

}

如您所见,正在创建DeleteNoteFragment然后显示。 让我们看一下DeleteNoteFragment本身:

public class DeleteNoteFragment extends DialogFragment {
    private Database database;
    private NoteAdapter noteAdapter;
    private int i;

    public DeleteNoteFragment(Database database, NoteAdapter noteAdapter, int i) {
        this.database = database;
        this.noteAdapter = noteAdapter;
        this.i = i;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.dialog_delete_note)
                .setPositiveButton(R.string.dialog_delete_confirm, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        database.removeNote(i);
                        noteAdapter.notifyDataSetChanged();
                        Toast.makeText(getActivity(), "Note deleted successfully!", Toast.LENGTH_LONG).show();
                    }
                })
                .setNegativeButton(R.string.dialog_delete_denny, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // User cancelled the dialog
                    }
                });

        // Create the AlertDialog object and return it
        return builder.create();
    }


}

也许你可以发现我犯错误的地方,或者有任何提示如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您正在删除数据库中的数据,但不是在适配器中删除:

database.removeNote(i);
noteAdapter.notifyDataSetChanged();

在适配器中创建一个方法,以获取适配器中的列表。类似的东西:

database.removeNote(i);
noteAdapter.getListOfItems().remove(i);
noteAdapter.notifyDataSetChanged();

答案 1 :(得分:0)

notifyDataSetChanged - &#34;通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。&#34;它不会从数据库重新加载数据。您仍然需要调用remove方法从适配器中删除该项,然后调用notifyDataSetChanged