SwipeToDeleteCallback - не работает должным образом - PullRequest
0 голосов
/ 25 февраля 2020

Я реализую смахивание для удаления в 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();
...