У меня есть список записей в списке, который я хочу, чтобы пользователь мог повторно отсортировать, используя метод перетаскивания. Я видел, как это реализовано в других приложениях, но я не нашел для этого учебника. Это должно быть то, что нужно и другим. Может ли кто-нибудь указать мне на какой-то код для этого?
132
Ответы:
Я работаю над этим уже некоторое время. Трудно понять, и я не утверждаю, что верю, но пока я доволен этим. Мой код и несколько демонстраций можно найти на
Его использование очень похоже на TouchInterceptor (на котором основан код), хотя были внесены значительные изменения в реализацию.
DragSortListView имеет плавную и предсказуемую прокрутку при перетаскивании и перемещении элементов. Перестановка элементов намного больше соответствует положению перетаскиваемого / плавающего элемента. Поддерживаются элементы списков разной высоты. Прокрутка с перетаскиванием настраивается (я демонстрирую быструю прокрутку с помощью перетаскивания по длинному списку - не то что приложение приходит на ум). Верхние / нижние колонтитулы соблюдаются. и т.д.?? Взглянуть.
источник
Теперь это довольно просто реализовать
RecyclerView
с помощью ItemTouchHelper . Просто переопределитеonMove
метод изItemTouchHelper.Callback
:Хороший учебник по этому поводу можно найти на medium.com: Drag and Swipe with RecyclerView
источник
Добавляю этот ответ для тех, кто гуглит по этому поводу ..
Недавно был эпизод DevBytes ( перетаскивание и перестановка ячеек ListView ), в котором объясняется, как это сделать.
Вы можете найти его здесь, также здесь доступен образец кода .
Что в основном делает этот код, так это то, что он создает
dynamic listview
расширение,listview
которое поддерживает перетаскивание и замену ячеек. Так что вы можете использоватьDynamicListView
вместо базового,ListView
и на этом вы реализовали ListView с помощью перетаскивания.источник
Библиотека DragListView делает это действительно изящно с очень хорошей поддержкой настраиваемых анимаций, таких как анимация высоты. Он также по-прежнему поддерживается и обновляется на регулярной основе.
Вот как вы это используете:
1: сначала добавьте библиотеку в gradle
2: Добавить список из xml
3. Установите прослушиватель перетаскивания
4. Создайте адаптер, переопределенный из DragItemAdapter
5. Реализуйте средство просмотра, которое расширяется от DragItemAdapter.ViewHolder.
Для получения более подробной информации перейдите на https://github.com/woxblom/DragListView.
источник
Я обнаружил, что DragSortListView работает хорошо, хотя начать с ним было бы проще. Вот краткое руководство по его использованию в Android Studio со списком в памяти:
Добавьте это в
build.gradle
зависимости для своего приложения:Создайте ресурс для идентификатора ручки перетаскивания, создав или добавив в
values/ids.xml
:Создайте макет для элемента списка, который включает ваше любимое изображение ручки перетаскивания, и назначьте его идентификатор идентификатору, который вы создали на шаге 2 (например,
drag_handle
).Создайте макет DragSortListView, примерно так:
Установите
ArrayAdapter
производную сgetView
переопределением, которое отображает представление элемента списка.Установите прослушиватель перетаскивания, который переупорядочивает элементы по мере их удаления.
источник
Недавно я наткнулся на этот замечательный Gist, который дает рабочую реализацию сортировки перетаскиванием
ListView
без каких-либо внешних зависимостей.По сути, он заключается в создании вашего собственного адаптера, расширяющегося
ArrayAdapter
как внутренний класс до активности, содержащей вашListView
. Затем на этом адаптере устанавливаетсяonTouchListener
элемент списка, который будет сигнализировать о начале перетаскивания.В этом Gist они устанавливают слушателя на определенную часть макета элемента списка («дескриптор» элемента), поэтому его нельзя случайно переместить, нажав любую его часть. Лично я предпочел использовать
onLongClickListener
вместо этого, но это решать вам. Вот отрывок из этой части:Это также включает добавление
onTouchListener
вListView
, который проверяет, перетаскивается ли элемент, обрабатывает замену и недействительность, а также останавливает состояние перетаскивания. Отрывок из этой части:И, наконец, вот как
stopDrag
иstartDrag
методы похожи, что обрабатывать включение и выключение процесса перетаскивания:источник