RecyclerView:删除对象后,其他对象在recyclerviewadapter的arraylist中没有更新的位置
RecyclerView: position of other object not updating in the arraylist of recyclerviewadapter after deleting an object
这是recyclerview适配器中的删除代码:
holder.delBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO delete record
NotesObject note = mDataList.get(position);
DBHelper db = new DBHelper(holder.itemView.getContext());
db.deleteNote(note.getUserID(), note.getNoteID());
mDataList.remove(position);
//TODO fix bug
// ArrayList<NotesObject> updateList = new ArrayList<NotesObject>();
// for(int i=0; i<mDataList.size(); i++){
// if(i!=position){
// updateList.add(mDataList.get(i));
// }
// }
// mDataList = updateList;
notifyItemRemoved(position);
// notifyDataSetChanged();
}
});
如果我在 recyclerview 中有 2 行并且我删除了第一行,则删除成功并且 recyclerview 得到完美更新。但是现在当我继续删除第二个项目时,项目 returns 位置 1(即,在位置 0 的项目被删除后它的位置没有得到更新)并且列表的大小返回为 1 (即,大小在先前删除后得到更新)因此它会抛出索引超出范围的错误。但是如果在删除第一项之后,我重新打开片段然后删除第二项,它就可以正常工作。我尝试手动更新列表索引,但引发了不一致错误。
以防将来有人遇到类似问题,这是解决方案:
调用notifyItemRemoved(position)
后,需要调用notifyItemRangeChanged(position, mDataList.size())
.
这是recyclerview适配器中的删除代码:
holder.delBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO delete record
NotesObject note = mDataList.get(position);
DBHelper db = new DBHelper(holder.itemView.getContext());
db.deleteNote(note.getUserID(), note.getNoteID());
mDataList.remove(position);
//TODO fix bug
// ArrayList<NotesObject> updateList = new ArrayList<NotesObject>();
// for(int i=0; i<mDataList.size(); i++){
// if(i!=position){
// updateList.add(mDataList.get(i));
// }
// }
// mDataList = updateList;
notifyItemRemoved(position);
// notifyDataSetChanged();
}
});
如果我在 recyclerview 中有 2 行并且我删除了第一行,则删除成功并且 recyclerview 得到完美更新。但是现在当我继续删除第二个项目时,项目 returns 位置 1(即,在位置 0 的项目被删除后它的位置没有得到更新)并且列表的大小返回为 1 (即,大小在先前删除后得到更新)因此它会抛出索引超出范围的错误。但是如果在删除第一项之后,我重新打开片段然后删除第二项,它就可以正常工作。我尝试手动更新列表索引,但引发了不一致错误。
以防将来有人遇到类似问题,这是解决方案:
调用notifyItemRemoved(position)
后,需要调用notifyItemRangeChanged(position, mDataList.size())
.