Я долго искал как сделать список с айтемами которые можно перетаскивать между собой, нашел кучу примеров которые работали но то не сохраняли положение куда переместили или например был пример который непонятно было как интегрировать в код, это библиотека github.com/bauerca/drag-sort-listview, возможно у меня руки кривые но я не смог ее поставить так что бы она работала, вечно что то вылетало и падало… В общем не подходило мне ничего, и я взялся говнокодить тот код который уже нашел до этого, который работал не верно.
В общем я вам сейчас открою страшную тайну как всегда (:
Для начала мы создадим кастомный ListView, создайте класс DragListView. Сейчас туда мы впишем много непонятного кода который творит чудеса. А ниже я объясню как он работает (частично ибо в некоторых местах я сам не понимаю этой магии).
DragListView.java
Если в кратце то в этом классе мы полностью переопределяем методы которые отвечают за ту или иную работу ListView, в нашем случае это оказались методы onInterceptTouchEvent() и onTouchEvent() который отвечают за передачу координат косаний на экран.
В этом классе мы их переопределяем и записываем координаты места где и когда было обработано нажатие на тот или иной элемент. Дальше мы создаем метод (startDrag(),onDrag(), stopDrag() и onDrop()) которые работают на магии, я пытался как то разобраться но все что я понял я изложил в комментариях к коду. В них мы обрабатываем координаты нажатий которые мы получили из методов onInterceptTouchEvent() и onTouchEvent() и делаем ту или иную задачу отвечающую данному методу.
В принципе просто но нифига не просто, кому интересно, поэксперементируйте, ибо у меня получилось только сделать код рабочим и не более. Хотелось бы сделать еще что бы айтемы раздвигались при перемещении того или иного айтема на нужное, но почему то код который я нашел не хотел работать в данном контектсте.
Ладно переходим дальше, теперь нам надо в нашей activity_main.xml вписать наш кастомный ListView, иначе оно не будет работать на обычном, не зря ж мы создавали этот сложнейший класс DragListView (:
activity_main.xml
Все очень просто, даже пояснять мне кажется не нужно, просто вставили наш кастомный класс.
Дальше нам нужно создать кастомный адаптер, это конечно не обязательно но мне захотелось так, ведь кастомный адаптер помогает гибче им управлять и соответственно от этого он становится удобней в добавлении всяких фишек на виью, в общем ребят, юзайте только кастом, поверьте мне старому волку :).
Сперва создадим кастомный леяут для отображения айтемов. (Ужас как закрутил, простите меня) Назовем его custom_item.
custom_item.xml
Тут у нас будет TextView для отображения собственно самого текста, и радиобаттон, просто для красоты) Что бы не тупо текст и было видно что это кастом, короче выпендриваюсь я.
А вот так будет выглядеть сам адаптер
DragListAdapter.java
Здесь ничего супер особенного нет, просто кастомный адаптер с переопределенным TextView для отображения текста, и все… Думаю если вам надо что то еще просто добавьте его на леяут и инициализируйте его в этом классе как я это сделал с TextView.
Ну а теперь нам осталось самое главное, в уже созданном ранее классе MainActivity, нам нужно инициализировать адаптер, список, и заполнить его разной чушью)
MainActivity.java
Вот и все, теперь вам осталось скомпилировать данный код и у вас должно получиться что то похожее на это:
Когда только скомпилировали
После того как наперетаскивали все добро как попало :)
Надеюсь что понятно объяснил все, так как я объяснял так как я понимаю сам, буду надеяться что доступно, хотя в статье больше трепа чем объяснений) Всем спасибо за внимание кто дочитал аж доседа.
Исходники
В общем я вам сейчас открою страшную тайну как всегда (:
Для начала мы создадим кастомный ListView, создайте класс DragListView. Сейчас туда мы впишем много непонятного кода который творит чудеса. А ниже я объясню как он работает (частично ибо в некоторых местах я сам не понимаю этой магии).
DragListView.java
Если в кратце то в этом классе мы полностью переопределяем методы которые отвечают за ту или иную работу ListView, в нашем случае это оказались методы onInterceptTouchEvent() и onTouchEvent() который отвечают за передачу координат косаний на экран.
В этом классе мы их переопределяем и записываем координаты места где и когда было обработано нажатие на тот или иной элемент. Дальше мы создаем метод (startDrag(),onDrag(), stopDrag() и onDrop()) которые работают на магии, я пытался как то разобраться но все что я понял я изложил в комментариях к коду. В них мы обрабатываем координаты нажатий которые мы получили из методов onInterceptTouchEvent() и onTouchEvent() и делаем ту или иную задачу отвечающую данному методу.
В принципе просто но нифига не просто, кому интересно, поэксперементируйте, ибо у меня получилось только сделать код рабочим и не более. Хотелось бы сделать еще что бы айтемы раздвигались при перемещении того или иного айтема на нужное, но почему то код который я нашел не хотел работать в данном контектсте.
Ладно переходим дальше, теперь нам надо в нашей activity_main.xml вписать наш кастомный ListView, иначе оно не будет работать на обычном, не зря ж мы создавали этот сложнейший класс DragListView (:
activity_main.xml
Все очень просто, даже пояснять мне кажется не нужно, просто вставили наш кастомный класс.
Дальше нам нужно создать кастомный адаптер, это конечно не обязательно но мне захотелось так, ведь кастомный адаптер помогает гибче им управлять и соответственно от этого он становится удобней в добавлении всяких фишек на виью, в общем ребят, юзайте только кастом, поверьте мне старому волку :).
Сперва создадим кастомный леяут для отображения айтемов. (Ужас как закрутил, простите меня) Назовем его custom_item.
custom_item.xml
Тут у нас будет TextView для отображения собственно самого текста, и радиобаттон, просто для красоты) Что бы не тупо текст и было видно что это кастом, короче выпендриваюсь я.
А вот так будет выглядеть сам адаптер
DragListAdapter.java
Здесь ничего супер особенного нет, просто кастомный адаптер с переопределенным TextView для отображения текста, и все… Думаю если вам надо что то еще просто добавьте его на леяут и инициализируйте его в этом классе как я это сделал с TextView.
Ну а теперь нам осталось самое главное, в уже созданном ранее классе MainActivity, нам нужно инициализировать адаптер, список, и заполнить его разной чушью)
MainActivity.java
Вот и все, теперь вам осталось скомпилировать данный код и у вас должно получиться что то похожее на это:
Когда только скомпилировали
После того как наперетаскивали все добро как попало :)
Надеюсь что понятно объяснил все, так как я объяснял так как я понимаю сам, буду надеяться что доступно, хотя в статье больше трепа чем объяснений) Всем спасибо за внимание кто дочитал аж доседа.
Комментариев нет:
Отправить комментарий