Tengo una lista de registros en una vista de lista que deseo que el usuario pueda volver a ordenar usando un método de arrastrar y soltar. He visto esto implementado en otras aplicaciones, pero no he encontrado un tutorial para ello. Debe ser algo que otros también necesitan. ¿Alguien puede señalarme algún código para hacer esto?
132
Respuestas:
He estado trabajando en esto por algún tiempo ahora. Es difícil hacerlo bien, y no pretendo hacerlo, pero hasta ahora estoy contento con eso. Mi código y varias demostraciones se pueden encontrar en
Su uso es muy similar al TouchInterceptor (en el que se basa el código), aunque se han realizado cambios significativos en la implementación.
DragSortListView tiene un desplazamiento suave y predecible mientras arrastra y baraja elementos. Los elementos aleatorios son mucho más consistentes con la posición del elemento arrastrado / flotante. Se admiten elementos de lista de altura heterogénea. El desplazamiento de arrastre es personalizable (demuestro el desplazamiento rápido de arrastre a través de una larga lista, no es que se me ocurra una aplicación). Encabezados / pies de página son respetados. etc. ?? Echar un vistazo.
fuente
Ahora es bastante fácil de implementar
RecyclerView
con ItemTouchHelper . Simplemente anule elonMove
método deItemTouchHelper.Callback
:Puede encontrar un tutorial bastante bueno sobre esto en medium.com: arrastre y deslice con RecyclerView
fuente
Estoy agregando esta respuesta para los que buscan en Google sobre esto ...
Hubo un episodio de DevBytes ( ListView Cell Dragging and Rearranging) ) que explica cómo hacer esto
Puede encontrarlo aquí también, el código de muestra está disponible aquí .
Lo que básicamente hace este código es que crea una
dynamic listview
extensiónlistview
que admite el arrastre y el intercambio de celdas. Para que pueda usar el enDynamicListView
lugar de su básicoListView
y eso es todo, ha implementado un ListView con arrastrar y soltar.fuente
DragListView lib hace esto muy bien con un soporte muy agradable para animaciones personalizadas, como animaciones de elevación. También se mantiene y actualiza regularmente.
Así es como lo usas:
1: agregue la lib a gradle primero
2: Agregar lista de xml
3: configurar el oyente de arrastre
4: Crear un adaptador anulado desde DragItemAdapter
5: Implemente un marcador de vista que se extienda desde DragItemAdapter.ViewHolder
Para obtener información más detallada, vaya a https://github.com/woxblom/DragListView
fuente
Encontré que DragSortListView funcionaba bien, aunque comenzar a usarlo podría haber sido más fácil. Aquí hay un breve tutorial sobre cómo usarlo en Android Studio con una lista en memoria:
Agregue esto a las
build.gradle
dependencias para su aplicación:Cree un recurso para la ID del controlador de arrastre creando o agregando a
values/ids.xml
:Cree un diseño para un elemento de la lista que incluya su imagen de control de arrastre favorita y asigne su ID a la ID que creó en el paso 2 (por ejemplo
drag_handle
).Cree un diseño DragSortListView, algo como esto:
Establezca una
ArrayAdapter
derivada con unagetView
anulación que represente la vista de su elemento de lista.Establezca un oyente de caída que reorganice los elementos a medida que se caen.
fuente
Recientemente me topé con este gran Gist que ofrece una implementación funcional de tipo de arrastre
ListView
, sin necesidad de dependencias externas.Básicamente consiste en crear su Adaptador personalizado que se extienda
ArrayAdapter
como una clase interna a la actividad que contiene suListView
. En este adaptador, uno establece un elementoonTouchListener
en su Lista de elementos que indicará el inicio del arrastre.En ese Gist establecen al oyente en una parte específica del diseño del elemento de la lista (el "identificador" del elemento), por lo que no se mueve accidentalmente presionando ninguna parte del mismo. Personalmente, preferí ir con un
onLongClickListener
en su lugar, pero eso depende de ti decidir. Aquí un extracto de esa parte:Esto también implica agregar un elemento
onTouchListener
aListView
, que comprueba si un elemento se está arrastrando, maneja el intercambio y la invalidación, y detiene el estado de arrastre. Un extracto de esa parte:Finalmente, así es como se ven los métodos
stopDrag
ystartDrag
, que manejan la habilitación y deshabilitación del proceso de arrastre:fuente