java RecyclerView+SQLite从数据库中删除行并调用。notifyItemRemoved临时读取底部的行
我有一个RecyclerView,它可以从SQLite数据库游标中获取数据,而无需将数据存储在ArrayList中
我尝试在单击按钮时删除给定位置的一行,但它会立即在RecyclerView的底部重新添加该行。然而,当我关闭并重新打开活动时,条目消失了(正如我所希望的那样)。此外,当我尝试单击重新添加的条目时,我会得到一个异常,因此它似乎不再存在
我在谷歌上搜索了一会儿,但找不到答案。这与光标有关吗?从表中删除一行后,是否必须向适配器提供新的游标?如果是,如何进行
这是我的代码:
public MyViewHolder(View itemView, final RecyclerViewClickListener listener) {
super(itemView);
mDeleteImage = itemView.findViewById(R.id.image_delete);
[...]
mDeleteImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onDeleteClick(position);
}
}
}
});
}
@Override
public void onDeleteClick(int position) {
SQLiteDatabase database = new MySQLiteHelper(this).getWritableDatabase();
Cursor cursor = database.rawQuery("select * from " + MyContract.MyEntry.TABLE_NAME, null);
cursor.moveToPosition(position);
database.delete(MyContract.MyEntry.TABLE_NAME, MyContract.MyEntry._ID + "=?", new String[] {cursor.getString(cursor.getColumnIndexOrThrow(MyContract.MyEntry._ID))});
mAdapter.notifyItemRemoved(position);
}
# 1 楼答案
因为您认为需要更新光标。是的,您需要这样做,因为
notifyItemRemoved(position)
将从本地列表中删除该条目。但是当你试图滚动时,数据会从光标中取出,它会在cursor
中找到数据最初将光标设置到适配器中的方式与更新光标的方式相同,您可以使用
swapCursor
或changeCursor
方法并调用notifyDataSetChanged()
有关
RecyclerView
光标的更多帮助,请查看this谢谢