RecyclerView + SQLite - 从数据库中删除行并调用.notifyItemRemoved在底部临时重新添加行

时间:2017-10-29 01:51:02

标签: java android sqlite

我有一个RecyclerView,可以从SQLite数据库游标中获取数据,而不会将数据存储在ArrayList中。

我尝试删除按钮单击时给定位置的行,但它立即重新添加了RecyclerView底部的行。当我关闭并重新打开活动时,条目消失了(因为我想要它)。此外,当我尝试单击重新添加的条目时,我得到一个异常,所以它似乎不再存在。

我用谷歌搜索了一段时间,但我找不到答案。它与光标有关吗?从表中删除行后,是否必须向适配器提供新的Cursor?如果是,怎么样?

这是我的代码:

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

答案 0 :(得分:0)

您认为需要更新光标。是的,您需要,因为notifyItemRemoved(position)将从本地列表中删除该条目。但是当您尝试滚动数据时,将从光标中获取数据,它会将数据发现到cursor

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

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

由于