gpt4 book ai didi

java - 从 RecyclerView 中删除时如何修复项目的重复?

转载 作者:行者123 更新时间:2023-11-29 22:53:23 25 4
gpt4 key购买 nike

我目前正在开发一个应用程序,我正在使用 RecyclerView 适配器,在我使用监听器的适配器中,让按钮在每个回收站项目中工作。现在我可以选择删除回收站项目,如果该项目是 RecyclerView 中的最后一项,一切都很好。但是,如果它位于开头或中间,它会被旁边的项目替换,并且该项目会重复。

现在这是 Activity 的代码

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note);
mDbAdapter = new NotesDbAdapter(this);
mDbAdapter.open();
listNotes = mDbAdapter.getResults();
mNotesAdapter = new NotesAdapter(this, mDbAdapter.fetchAllNotes(),listNotes);
mNotesAdapter.notifyDataSetChanged();
mRecyclerView = findViewById(R.id.listView_notes);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setAdapter(mNotesAdapter);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这是适配器代码:

构造函数:

public NotesAdapter(Context ctx, Cursor cursor, ArrayList<Note> listNotes){
this.mCtx = ctx;
this.mCursor = cursor;
this.mListNotes = listNotes;
}

还有 onBindViewHolder

//BIND DATA TO VIEWS
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (!mCursor.moveToPosition(position)) {
return;
}

String noteT = mCursor.getString(mCursor.getColumnIndex(NotesDbAdapter.COL_TITLE));
String noteC = mCursor.getString(mCursor.getColumnIndex(NotesDbAdapter.COL_CONTENT));
holder.noteTitle.setText(noteT);
holder.noteDescription.setText(noteC);
holder.noteCard_settingsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDbAdapter = new NotesDbAdapter(mCtx);
mDbAdapter.open();
Toast.makeText(mCtx,"The position is:"+holder.getAdapterPosition(),Toast.LENGTH_SHORT).show();
PopupMenu popup = new PopupMenu(mCtx, view);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu_popup, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.popup_edit:
Toast.makeText(mCtx,"You pressed edit note", Toast.LENGTH_SHORT).show();
return true;
case R.id.popup_delete:
deleteItem(holder.getAdapterPosition());
Toast.makeText(mCtx, "Delete note", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
popup.show();
}
});
}

其他函数如下。

@Override
public int getItemCount() {
return mListNotes.size();
}

@Override
public long getItemId(int position) {
return position;
}

private void deleteItem(int position) {
mDbAdapter.deleteNoteById(mListNotes.get(position).getId());
mListNotes.remove(position);
notifyItemRemoved(position);
notifyItemRangeRemoved(position, 1);
}

public class ViewHolder extends RecyclerView.ViewHolder{
TextView noteTitle;
TextView noteDescription;
CardView cardView;
Button noteCard_settingsButton;

public ViewHolder(View view) {
super(view);
noteTitle = view.findViewById(R.id.note_titleView);
noteDescription = view.findViewById(R.id.note_contentView);
cardView = view.findViewById(R.id.notes_cardView);
noteCard_settingsButton = view.findViewById(R.id.note_card_settings_button);
}
}

所以我希望注释被完全删除,并且它后面的注释向下移动。

最佳答案

看起来您没有更新您在 onBindViewHolder 函数中使用的 mCursor。虽然您正在更新 mListNotes,但您仍在从光标填充 RecyclerView 的每个项目中的数据,并且当您从中删除项目时,光标不会更新列表。

我宁愿建议从您的 ArrayList(即 mListNotes)而不是 onBindViewHolder 中的光标获取数据。像下面这样修改构造函数。

// Remove the mCursor completely.
// Looks like you do not need that.
public NotesAdapter(Context ctx, ArrayList<Note> listNotes){
this.mCtx = ctx;
this.mListNotes = listNotes;
}

然后在您的 onBindViewHolder 中从 mListNotes 中获取数据。

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

String noteT = mListNotes.get(position).getTitle();
String noteC = mListNotes.get(position).getContent();

holder.noteTitle.setText(noteT);
holder.noteDescription.setText(noteC);
holder.noteCard_settingsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDbAdapter = new NotesDbAdapter(mCtx);
mDbAdapter.open();
Toast.makeText(mCtx,"The position is:"+holder.getAdapterPosition(),Toast.LENGTH_SHORT).show();
PopupMenu popup = new PopupMenu(mCtx, view);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu_popup, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.popup_edit:
Toast.makeText(mCtx,"You pressed edit note", Toast.LENGTH_SHORT).show();
return true;
case R.id.popup_delete:
deleteItem(holder.getAdapterPosition());
Toast.makeText(mCtx, "Delete note", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
popup.show();
}
});
}

我希望这能解决您的问题。

如果您想将光标保留在适配器中,请确保传递给适配器的光标也已更新。

关于java - 从 RecyclerView 中删除时如何修复项目的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57681953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com