简体   繁体   English

notifyDataSetChanged(); 不刷新ListView?

[英]notifyDataSetChanged(); not refreshing ListView?

I'm working on a notes app and I'm running into trouble deleting notes. 我正在开发笔记应用程序,但是在删除笔记时遇到了麻烦。 the problem I'm running into is after the note is deleted, it still shows in the listview. 我遇到的问题是笔记删除后,它仍然显示在列表视图中。 I'm trying to use notifyDataSetChanged(); 我正在尝试使用notifyDataSetChanged(); but it doesn't seem to be working for me :/ i know its probably something I'm doing wrong with my adapter but I'm having trouble narrowing down my mistake as I'm very new to android. 但它似乎不适用于我:/我知道它可能是我的适配器做错了,但是由于我对android很陌生,所以我很难缩小错误的范围。 any help would be greatly appreciated, thanks in advanced! 任何帮助将不胜感激,谢谢先进! :D :D

MainActivity public class MainActivity extends AppCompatActivity { MainActivity公共类MainActivity扩展了AppCompatActivity {

private ListView mListViewNotes;
ArrayAdapter<Note> listAdapter;
ArrayList<Note> list_items = new ArrayList<>();
int count = 0;
String list_item;
Object mActionMode;
Toolbar app_bar;
ArrayList<Note> notes;
private String mNoteFileName;
private Note mLoadedNote;
Note loadedNote;
ImageView picTest;
NoteAdapter na;

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    app_bar = (Toolbar) findViewById(R.id.app_bar);
    TextView title_1 = (TextView) findViewById(R.id.title1);
    TextView title_2 = (TextView) findViewById(R.id.title2);
    TextView title_m = (TextView) findViewById(R.id.title_m);
    Typeface music_font = Typeface.createFromAsset(getAssets(), "fonts/melodymakernotesonly.ttf");
    Typeface notes_font = Typeface.createFromAsset(getAssets(), "fonts/the unseen.ttf");
    setSupportActionBar(app_bar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setElevation(12);
    title_1.setTypeface(music_font);
    title_2.setTypeface(notes_font);
    title_m.setTypeface(music_font);

    listAdapter = new ArrayAdapter<Note>(this, R.layout.item_note, R.id.item_note, list_items);

    mNoteFileName = getIntent().getStringExtra("NOTE_FILE");
    if (mNoteFileName != null && !mNoteFileName.isEmpty()) {
        loadedNote = Utilities.getNoteByName(this, mNoteFileName);
    }

    mListViewNotes = (ListView) findViewById(R.id.listview_notes);
    mListViewNotes.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    mListViewNotes.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            if (list_items.contains(notes.get(position))) {
                count = count-1;
                list_items.remove(notes.get(position));
                mode.setTitle(count + " Notes Selected");
            } else {
                count = count+1;
                list_items.add(notes.get(position));
                mode.setTitle(count + " Notes Selected");
            }

            if (count == 0) {
                mode.setTitle("No Notes Selected");
            }
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {

            app_bar.setVisibility(View.GONE);
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            deleteNote();
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            count = 0;
            app_bar.setVisibility(View.VISIBLE);
            list_items.clear();
        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.add_note:
            startActivity(new Intent(this, NoteActivity.class));
            break;
        case R.id.action_settings:
            Log.d("list:", "testing");
    }

    return true;
}

@Override
protected void onResume() {
    super.onResume();
    mListViewNotes.setAdapter(null);

    notes = Utilities.getAllSavedNotes(this);

    if (notes == null || notes.size() == 0) {
        Toast.makeText(this, "No Notes!", Toast.LENGTH_LONG).show();
    } else {
        na = new NoteAdapter(this, R.layout.item_note, notes);
        mListViewNotes.setAdapter(na);

        mListViewNotes.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String filename = ((Note) mListViewNotes.getItemAtPosition(position)).getDateTime() + Utilities.FileExtention;

                Intent view_note = new Intent(getApplicationContext(), NoteActivity.class);
                view_note.putExtra("NOTE_FILE", filename);
                startActivity(view_note);
            }
        });
    }
}

private void deleteNote() {

        if(list_items.contains(null)) {
            finish();
        } else {
            AlertDialog.Builder dialog = new AlertDialog.Builder(this)
                    .setTitle("Delete")
                    .setMessage("Are you sure?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            for (Note loadedNote : list_items) {
                                Utilities.deleteNote(getApplicationContext(), loadedNote.getDateTime() + Utilities.FileExtention);
                            }
                            na.notifyDataSetChanged();
                            listAdapter.notifyDataSetChanged();
                        }
                    })
                    .setNegativeButton("No", null)
                    .setCancelable(false);
            dialog.show();
        }
}

NoteAdapter 笔记适配器

public class NoteAdapter extends ArrayAdapter<Note> {

public NoteAdapter(Context context, int resource, ArrayList<Note> notes) {
    super(context, resource, notes);



}

@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    //return super.getView(position, convertView, parent);

    if(convertView == null) {
        convertView = LayoutInflater.from(getContext())
                .inflate(R.layout.item_note, null);
    }

    Note note = getItem(position);

    if(note != null) {
        TextView title = (TextView) convertView.findViewById(R.id.list_note_title);
        TextView content = (TextView) convertView.findViewById(R.id.list_note_content);
        TextView date = (TextView) convertView.findViewById(R.id.list_note_date);

        Typeface scribble_card = Typeface.createFromAsset(getContext().getAssets(), "fonts/the unseen.ttf");
        title.setTypeface(scribble_card);
        content.setTypeface(scribble_card);

        title.setText(note.getTitle());
        date.setText(note.getDateTimeFormatted(getContext()));

        if(note.getContent().length() > 25) {
            content.setText(note.getContent().substring(0,25) + "...");
        } else {
            content.setText(note.getContent());
        }

        if(note.getContent().length() <= 0) {
            content.setText("(Empty Note..)");
        } else {
            content.setText(note.getContent());
        }

        if (note.getTitle().length() <= 0) {
            title.setText("(Untitled)");
        } else {
            title.setText(note.getTitle());
        }
    }

    return convertView;
}

You are setting adapter with a list :- 您正在使用列表设置适配器:

 na = new NoteAdapter(this, R.layout.item_note, notes);
    mListViewNotes.setAdapter(na);

na.notifyDataSetChanged(); na.notifyDataSetChanged(); will only work if your notes list is changed . 只有在您的便笺列表更改的情况下才能工作。 And i don't see that you remove/add/modify on notes list. 而且我没有看到您在注释列表上删除/添加/修改。 If you are deleting item from list you need to remove it from notes list too See below:- 如果您要从列表中删除项目,则也需要将其从注释列表中删除,请参见以下内容:

notes.remove(position_to_remove); na.notifyDataSetChanged();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM