Отменить в RecyclerView с помощью прослушивателя Swipe Touch - PullRequest
0 голосов
/ 28 августа 2018

У меня есть список простых предметов в RecyclerView. Используя SwipeTouchHelper, он хорошо работает как для отмены, так и для удаления действий. Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю кнопку отмены из snakbar, он восстанавливает элемент, а также показывает полосу прокрутки в следующей строке.

 @Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction, int position) {

    ListNoteDataBase appDatabase = new ListNoteDataBase(context);
    appDatabase.open();
    itemsList = appDatabase.getfullList(title_id);
    appDatabase.close();

    // get the removed item name to display it in snackbar

    String text = itemsList.get(viewHolder.getAdapterPosition()).getText();
    final String id = itemsList.get(position).getId();


    // backup of removed item for undo purpose
    final int adapterPosition = viewHolder.getAdapterPosition();
    final ItemModel items = itemsList.get(adapterPosition);

    // showing snack bar with Undo option

    Snackbar snackbar = Snackbar.make(coordinatorLayout, text + " removed !", Snackbar.LENGTH_SHORT);
   snackbar.setAction("UNDO", new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    adapter.restoreItem(items, adapterPosition);
   }});
    snackbar.addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {

        public void onDismissed(Snackbar transientBottomBar, int event) {
            switch (event) {
                case DISMISS_EVENT_TIMEOUT:
                    ListNoteDataBase appDatabase = new ListNoteDataBase(context);
                    adapter.removeItem(viewHolder.getAdapterPosition());
                    appDatabase.open();
                    appDatabase.deleteNotes(id);
                    adapter = new NoteListAdapter(context, appDatabase.getfullList(title_id));
                    recyclerView.setAdapter(adapter);
                    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
                        @Override
                        public void onChanged() {
                            super.onChanged();
                            checkEmpty();
                        }

                        @Override
                        public void onItemRangeInserted(int positionStart, int itemCount) {
                            super.onItemRangeInserted(positionStart, itemCount);
                            checkEmpty();
                        }

                        @Override
                        public void onItemRangeRemoved(int positionStart, int itemCount) {
                            super.onItemRangeRemoved(positionStart, itemCount);
                            checkEmpty();
                        }});
                    adapter.notifyDataSetChanged();
                    appDatabase.close();
                    break;
            }
        }
    });

    snackbar.setActionTextColor(Color.RED);
    snackbar.show();
}

Код для восстановления элемента из адаптера:

 public void restoreItem(ItemModel item, int position) {
    data.add(position, item);
    notifyItemInserted(position);
}

На изображении красная линия под текстом появляется после того, как я нажимаю кнопку «Отменить» на панели snakbar

Пожалуйста, сообщите мне, как решить эту проблему.

...