В моем 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);
}