有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    因为您认为需要更新光标。是的,您需要这样做,因为notifyItemRemoved(position)将从本地列表中删除该条目。但是当你试图滚动时,数据会从光标中取出,它会在cursor中找到数据

    最初将光标设置到适配器中的方式与更新光标的方式相同,您可以使用swapCursorchangeCursor方法并调用notifyDataSetChanged()

    有关RecyclerView光标的更多帮助,请查看this

    谢谢