Почему удаление нескольких элементов из recylerView в MVVM не работает в Android? - PullRequest
2 голосов
/ 04 октября 2019

Я пишу приложение todo, чтобы узнать больше об архитектуре Android. Я реализовал RecyclerView с адаптером, который получает данные от ViewModel . Теперь я пытаюсь реализовать удаление с помощью кнопки «Отменить» на панели Snackbar.

Все работает нормально, пока не пытаюсь удалить 2 элемента из RecyclerView одновременно. Только один элемент удален, второй появляется снова. Проблема существует только тогда, когда закусочная не закрыта. Я использую

Snackbar.Callback.DISMISS_EVENT_ACTION

для обработки, когда пользователь нажимает кнопку отмены на снэк-баре

class FolderFragment
...
   adapter = new FolderListAdapter(getContext(), folderViewModel);
   folderViewModel.getFolders().observe(this, adapter::setFolders);
...
public void onSwipe() {
        Snackbar.make(getView(), 
R.string.folder_removed_message, Snackbar.LENGTH_SHORT)
                .setAction(R.string.undo, v ->
                        adapter.undoDelete())
                .addCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar transientBottomBar, int event) {
                        if (event != Snackbar.Callback.DISMISS_EVENT_ACTION) {
                            folderViewModel.delete(adapter.getDeletedFolder());
                        }
                    }
                })
                .show();

public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.FolderViewHolder>
...
   void setFolders(List<Folder> folders) {
        this.folders = folders;
        notifyDataSetChanged();
    }
    public void onItemDismiss(int position) {
        mDeletedPosition = position;
        mDeletedFolder = folders.get(position);
        folders.remove(position);
        notifyItemRemoved(position);
    }
    public void undoDelete() {
        folders.add(mDeletedPosition, mDeletedFolder);
        notifyItemInserted(mDeletedPosition);
    }
...
public class FolderViewModel extends AndroidViewModel 
...
 public void delete(Folder folder) {
        folderRepository.delete(folder);
    }
...

См. Поведение моего адаптера RecyclerView по ссылке ниже поведение

пытается комментировать строки в адаптере, который удаляет элемент из списка в адаптере - не работает

ведение журнала setList () в адаптере - viewmodel не обновляет LiveData, потому что он работает в фоновом режиме, но я не знаю, как это сделатьрешить этот

проект на github

...