私は、以前にArrayListにデータを格納せずにSQLite Database Cursorからデータを取得するRecyclerViewを持っています。RecyclerView + SQLite - データベースから行を削除し、.notifyItemRemovedを呼び出すと、一番下に行が一時的に再追加されます。
ボタンのクリックで指定された位置で行を削除しようとしましたが、すぐにRecyclerViewの下部に行が再追加されます。アクティビティを閉じて再度開くと、エントリは消えてしまいます(私が望むように)。また、私は再追加されたエントリをクリックしようとすると、私は例外を取得するので、もう存在しないようです。
私はしばらくの間googledが、私は答えを見つけることができませんでした。それはカーソルと関係がありますか?テーブルから行を削除した後、新しいカーソルをアダプタに提供する必要がありますか?はいの場合、どうですか?
これは私のコードです:
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);
}
ありがとうございます。しかし、私は、私はswapCursorメソッドを持っていないので、CursorAdapterを使用しないでください。このCursorAdapterはListViewに対してのみ使用できますか? メソッドを使って新しいCursorを提供しようとしましたが、動作しませんでした。 –
カスタムリサイクラビューアダプタですか? –
はい。 mCursorを新しいCursorに設定しようとしましたが、動作しませんでした。カーソルがアダプタのコンストラクタを介して提供される方法です。 –