Я реализую смахивание для удаления в RecyclerView, но я заметил, что он не работает должным образом.
Когда приложение запускается впервые, элементы собираются из БД и полулируются, когда я смахиваю работает отлично. После этого, если я добавляю элемент в список (также в базу данных), я снова восстанавливаю все элементы из базы данных и воссоздаю адаптер, но если я пролистываю один элемент, размер адаптера в SwipeToDeleteCallback не совпадает с элементы базы данных, поэтому я получаю сообщение об ошибке IndexOutOfBounds.
Вы можете мне помочь? Я не знаю, что не так ...
public SwipeToDeleteCallback(RecyclerviewAdapter adapter) {
super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
mAdapter = adapter;
icon = ContextCompat.getDrawable(mAdapter.getContext(), R.drawable.ic_delete);
background = new ColorDrawable(Color.RED);
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
mAdapter.deleteItem(position);
}
public void deleteItem(int position) {
mRecentlyDeletedItem = vehiculos.get(position);
mRecentlyDeletedItemPosition = position;
vehiculos.remove(position);
notifyItemRemoved(position);
showUndoSnackbar();
}
RecyclerviewAdapter recyclerviewAdapter = new RecyclerviewAdapter(context);
recyclerviewAdapter.setVehiculosList(vehiculos);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new SwipeToDeleteCallback(recyclerviewAdapter));
itemTouchHelper.attachToRecyclerView(recycler);
recycler.setAdapter(recyclerviewAdapter);
Вот код, которым я следую:
https://medium.com/@zackcosborn / step-by-step-recyclerview-swipe -to-delete-and-undo-7bbae1fce27e
vehiculos = new ArrayList<Vehiculo>();
Database dbHelper = new Database(context);
SQLiteDatabase db = dbHelper.getReadableDatabase();
String[] columns = new String[]{
Database.SQL_FIELD_MATRICULA,
Database.SQL_FIELD_ETIQUETA,
Database.SQL_FIELD_DESCRIPCION
};
Cursor c = db.query(Database.SQL_TABLE_MATRICULAS, columns, null, null, null, null, null);
c.moveToFirst();
while (!c.isAfterLast()) {
Vehiculo vehiculo = new Vehiculo(c.getString(c.getColumnIndex(Database.SQL_FIELD_MATRICULA)), c.getString(c.getColumnIndex(Database.SQL_FIELD_ETIQUETA)), c.getString(c.getColumnIndex(Database.SQL_FIELD_DESCRIPCION)));
vehiculos.add(vehiculo);
c.moveToNext();
}
c.close();
db.close();