Как начать перетаскивание элемента в RecyclerView другим, чем долгое нажатие? - PullRequest
2 голосов
/ 27 мая 2019

В моем Android-приложении есть несколько RecyclerViews, элементы которых должны быть переставлены пользователем. Каждый элемент содержит «элемент управления переупорядочением», который при нажатии должен начать перетаскивание этого элемента. (Сравнимо с «элементом переупорядочения» в ячейке представления таблицы iOS). Перетаскивание не должно быть начато долгим нажатием. Мое приложение использует привязку данных.

Я нашел несколько примеров, в которых ItemTouchHelper используется для включения перетаскивания в RecyclerView. Все эти примеры используют стандартное долгое нажатие, чтобы начать перетаскивание. Код ниже показывает BindingAdapter для включения перетаскивания, как это используется в большинстве примеров:

    @BindingAdapter(value = {"draggable"})
    public static void bindRecyclerViewDraggable(RecyclerView recyclerView, boolean draggable) {

        ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP, 0) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder dragged, @NonNull RecyclerView.ViewHolder target) {

                int draggedPos = dragged.getAdapterPosition();
                int targetPos = target.getAdapterPosition();

                recyclerView.getAdapter().notifyItemMoved(draggedPos, targetPos);

                return true;
            }

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

            }
        });

        helper.attachToRecyclerView(recyclerView);
    }

Этот метод работает хорошо в случае, если длительное нажатие используется для запуска перетаскивания, но как запустить перетаскивание, когда на элементе нажата кнопка «Изменить порядок»?

Одно решение, которое я вижу, состоит в том, что я создаю экземпляр ItemTouchHelper в ViewModel, который связан с представлением, содержащим RecyclerView, а затем присоединяю его к RecyclerView через привязку данных. Тем не менее, это не совсем правильно. ItemTouchHelper - это класс View (он расширяет RecyclerView.ItemDecoration), и я хочу как можно меньше просматривать связанные вещи в моей ViewModel.

Кто-нибудь может придумать лучшее решение для этой проблемы?

...