В моем 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.
Кто-нибудь может придумать лучшее решение для этой проблемы?