Удалить и отменить в RecyclerView вызывает несколько записей - PullRequest
0 голосов
/ 26 апреля 2019

В моем SQLite Database есть данные, которые я загружаю в RecyclerView. С ItemTouchHelper вы можете удалить элемент, и появляется Snackbar с отменой .action.

Проблема у меня заключается в том, что когда я удаляю и отменяю несколько раз и перезагружаю приложение, у меня появляется несколько записей, где я удаляю и восстанавливаю.

Как вы можете видеть здесь: https://youtu.be/pHSo5EZeSjU

ItemTouchHelper

    // Delete and undo pocket items
ItemTouchHelper.SimpleCallback recyclerviewSwipe = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        final Pocket pocketList = PocketItems.get(viewHolder.getAdapterPosition());
        final int deletetIndex = viewHolder.getAdapterPosition();

        pocketItemAdapter.removeItem(viewHolder.getAdapterPosition());


        if(pocketItemAdapter.getItemCount() != 0){
            textView_placeholder_recyclerview.setVisibility(View.GONE);
            imageView_placeholder_recyclerview.setVisibility(View.GONE);
        }else{
            textView_placeholder_recyclerview.setVisibility(View.VISIBLE);
            imageView_placeholder_recyclerview.setVisibility(View.VISIBLE);
        }

        Snackbar snackbar = Snackbar.make(coordinatorLayoutPocketMain,R.string.successfully_deleted,3000)
                .setAction(R.string.undo, new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        pocketItemAdapter.restoreItem(pocketList,deletetIndex);
                        database.createpocketEntry(pocketList.getTIMESTAMP(),pocketList.getAMOUNT(),pocketList.getDESCRIPTION(),pocketList.getCATEGORY());
                    }
                });
        snackbar.getView().setBackgroundColor(ContextCompat.getColor(PocketMain.this,R.color.colorBright));

        snackbar.show();
    }

};
new ItemTouchHelper(recyclerviewSwipe).attachToRecyclerView(recyclerViewPocketItems);

Адаптер RecyclerView

void removeItem(int position){
    Database database = new Database(context);
    database.deletepocketEntry(Integer.parseInt(pocketItems.get(position).getROWID()));
    pocketItems.remove(position);
    notifyItemRemoved(position);


}

void restoreItem(Pocket item, int position){
    pocketItems.add(position,item);
    notifyItemInserted(position);
    Log.d("RESTORED","restoreItem()");
}

Открытый помощник SQLite:

  Integer deletepocketEntry(Integer rowID){
        SQLiteDatabase database = this.getWritableDatabase();
        Log.d("RESTORED","deletePocketEntry");
        return database.delete(KEY_DATABASE_TABLE,"rowid = ?", new String[]{Integer.toString(rowID)});
 }

long createpocketEntry(String timestamp,String amount,String description, String category){
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues pocketValues = new ContentValues();
    pocketValues.put(KEY_TIMESTAMP,timestamp);
    pocketValues.put(KEY_AMOUNT,amount);
    pocketValues.put(KEY_DESCRIPTION,description);
    pocketValues.put(KEY_CATEGORY,category);
    Log.d("RESTORED","createPocketEntry");
    return database.insert(KEY_DATABASE_TABLE,null,pocketValues);
}

А когда я в журнале удаляю, все восстанавливается нормально:

2019-04-26 16:17:57.034 15457-15457/de.corestudio.coinmaster D/RESTORED: deletePocketEntry
2019-04-26 16:17:58.504 15457-15457/de.corestudio.coinmaster D/RESTORED: restoreItem()
2019-04-26 16:17:58.504 15457-15457/de.corestudio.coinmaster D/RESTORED: createPocketEntry
2019-04-26 16:18:00.825 15457-15457/de.corestudio.coinmaster D/RESTORED: deletePocketEntry
2019-04-26 16:18:01.878 15457-15457/de.corestudio.coinmaster D/RESTORED: restoreItem()
2019-04-26 16:18:01.878 15457-15457/de.corestudio.coinmaster D/RESTORED: createPocketEntry

------------------ РЕДАКТИРОВАТЬ --------------------

Вы можете увидеть это здесь https://www.youtube.com/watch?v=FjWIpXgH5ig Так что в основном я что-то изменил. Это должно вернуть 1, но это не так, и я думаю, что это проблема.

int removeItem(int position){
    Database database = new Database(context);
    int boo = database.deletepocketEntry(Integer.parseInt(pocketItems.get(position).getROWID()));
    pocketItems.remove(position);
    notifyItemRemoved(position);
    return boo;
}

И deletePocketEntry:

Integer deletepocketEntry(Integer rowID){
    SQLiteDatabase database = this.getWritableDatabase();
    return database.delete(KEY_DATABASE_TABLE,"rowid = ?", new String[]{Integer.toString(rowID)});
}

Таким образом, каждый раз, когда появляется красная закусочная, это происходит из-за того, что она возвращает 0 вместо 1:

if(pocketItemAdapter.removeItem(viewHolder.getAdapterPosition()) == 1){


                    Snackbar snackbar = Snackbar.make(coordinatorLayoutPocketMain,R.string.successfully_deleted,3000)
                            .setAction(R.string.undo, new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    pocketItemAdapter.restoreItem(pocketList,deletetIndex);
                                    database.createpocketEntry(pocketList.getTIMESTAMP(),pocketList.getAMOUNT(),pocketList.getDESCRIPTION(),pocketList.getCATEGORY());
                                }
                            });
                    snackbar.getView().setBackgroundColor(ContextCompat.getColor(PocketMain.this,R.color.colorBright));

                    snackbar.show();
                }else{

                    final Snackbar snackbar = Snackbar.make(coordinatorLayoutPocketMain,"Löschen war nicht erfolgreich",Snackbar.LENGTH_SHORT);
                            snackbar.setAction("Ok", new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    snackbar.dismiss();
                                }
                            });
                    snackbar.getView().setBackgroundColor(ContextCompat.getColor(PocketMain.this,R.color.red));
                    snackbar.show();
                    pocketItemAdapter.restoreItem(pocketList,deletetIndex);

                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...