Я рекомендую вам следовать предложению йогурта (Комментарий).Потому что, если вы удалите его из базы данных, а затем снова вставите его, вам придется извлечь весь список и дважды обновить recyclerView.Таким образом, его предложенная техника лучше для производительности.Я помогу вам реализовать это.Прежде всего, я бы посоветовал вам поддерживать класс abstract BaseAdapter
, который является необязательным, поскольку вы можете реализовать его непосредственно в вашем RecyclerAdapter
.
BaseAdapter
public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
private List<T> mList = new ArrayList<>();
@Override
public int getItemCount() {
return mList.size();
}
public T remove(int position) {
if (position < getItemCount() && position>= 0) {
T item = mList.remove(position);
notifyItemRemoved(position);
return item;
}
return null;
}
public void add(T item, int position) {
mList.add(position, item);
notifyItemInserted(position);
}
public void addAll(List<T> items) {
mList.addAll(items);
notifyDataSetChanged();
}
public void reload(List<T> items) {
mList.clear();
addAll(items);
}
}
Теперь вам нужно вызвать следующий метод deleteItem()
, чтобы временно удалить только из recyclerView и полностью удалить, когда истекло время ожидания.
private void deleteItem(View view, final int position) {
final YourEntity item = adapter.remove(position);
final Snackbar snackbar = Snackbar.make(view, item.getName() + " is Deleted", Snackbar.LENGTH_LONG);
snackbar.setAction("Undo", new View.OnClickListener() {
@Override
public void onClick(View view) {
adapter.add(item, position);
}
});
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
if (event == DISMISS_EVENT_TIMEOUT) {
// TODO delete from the database
}
}
});
snackbar.show();
}