@K-Kuznetsov

Странное поведение drag&drop с использованием ItemTouchHelper и RecyclerView. Как исправить?

Я пытаюсь использовать RecyclerView с очень удобным для моих целей ItemTouchHelper.
Все что я хочу - это простые сценарии “drag & drop” и “swipe-to-dismiss”.
Swipe работает корректно, элементы удаляются в адаптере корректно, анимация тоже соответствует происходящему, но “drag & drop” очень странно работает. После long click, элемент не начинает перемещение, хотя выделение срабатывает, а в адаптере вызывается метод onItemMove.

Вот такое странное поведение в моем RecyclerView
59d21fcab04c1118769817.gif

И вот чего я пытаюсь добиться
59d21ff4ce99d680525653.gif

Вот код презентера, onSelectedChanged и clearView тут только для наглядности выделения элементов.

addedCitiesRecycler.setLayoutManager(llmAddedCities);

        adapterAddedCities = new AdapterAddedCities();

       
        ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.START | ItemTouchHelper.END) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                adapterAddedCities.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                adapterAddedCities.onItemDismiss(viewHolder.getAdapterPosition());
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                    AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
                    holder.itemView.setBackgroundColor(Color.LTGRAY);
                }
                super.onSelectedChanged(viewHolder, actionState);
            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
                holder.itemView.setBackgroundColor(0);
            }
        };

        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(addedCitiesRecycler);


Вот пара методов адаптера, изменяющих набор данных и оповещающих RecyclerView о произошедших изменениях.

public void onItemDismiss(int position) {
        citiesData.remove(position);
        notifyItemRemoved(position);
    }

    public void onItemMove(int fromPosition, int toPosition) {
        CityInfo tmp = citiesData.remove(fromPosition);
        citiesData.add(toPosition > fromPosition ? toPosition - 1 : toPosition, tmp);
        notifyItemMoved(fromPosition, toPosition);
    }


Я запускал проект из
статьи
все работает отлично, не пойму в чем может быть проблема.

Может быть я не учел что-то, связанное c фокусом на передвигаемом элементе или снятии выделения?
  • Вопрос задан
  • 524 просмотра
Решения вопроса 1
@K-Kuznetsov Автор вопроса
Я обновил com.android.support:recyclerview-v7:26.0.0-alpha1 до com.android.support:recyclerview-v7:27.0.0 в проекте и все заработало отлично.

Скорее всего это был баг в библиотеке, поэтому если вы столкнулись с подобной проблемой, просто обновитсь до последней версии и перепроверьте как себя ведет RecyclerView.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы