¿Cómo hacer un ListView con elementos arrastrables?
Buscaba un ListPreference en el cual el usuario puede cambiar el orden de artículos de una lista. Los elementos podrían ser arrastrados y pueden ser re-ordenados por el usuario.
Vi esto en mi ROM de encargo (y estoy casi seguro lo vi en Cyanogenmod) para el QuickPanel. A continuación se muestra una captura de pantalla para obtener la idea:
- ¿Cómo implementar ExpandableListview multinivel en Android?
- ListView onclick va a una nueva actividad
- Diseño relativo verificable como elemento en la lista de selección múltiple
- Botón fijo debajo de un ListView desplazable
- ¿Por qué AdMob no devuelve
Sé cómo puedo hacer elementos de ListView personalizados y establecer el icono para indicar que los elementos son arrastrables, pero no sé cómo hacerlos arrastrar y cambiar el orden en consecuencia. En cuanto a guardarlos en las preferencias, encontré esto que podría ser implementado fácilmente.
PS : Sé que Cyanogenmod es de código abierto, pero no pude encontrar la fuente para esta cosa en particular 🙁 Lo más cercano que pude conseguir fue esto , que debería estar en algún lugar cerca de la otra pantalla …
Gracias de antemano por cualquier consejo sobre esto.
ACTUALIZACIÓN : Terminé usando los archivos de la respuesta aceptada, con adiciones y modificaciones. Los incluyo aquí para más referencia.
-
Utilice un adaptador personalizado (ArrayAdapter en mi caso), para implementar la retroalimentación visual de que este elemento es arrastrable, que es un ImageView cerca de TextView. Esto es opcional.
-
Establezca un DragListener y RemoveListener para actualizar la lista en consecuencia. ListView no lo hace automáticamente. Y depende del adaptador que esté utilizando.
-
Había una línea que encajaba una vista a un grupo de la visión, él hizo algunos errores, así que quité el molde sin ninguÌ n problema, no era necesario. (En el método onInterceptTouchEvent).
-
Cambiar
mRemoveMode = 1;
En el constructor de TouchInterceptor, o uno de:FLING = 0; SLIDE = 1; TRASH = 2;
FLING = 0; SLIDE = 1; TRASH = 2;
. Creo que paraTRASH
, un recurso debe estar disponible también.
En realidad tomé el archivo no del enlace de la respuesta, sino del Cyanogenmod, que ya tenía, pero supongo que estos archivos eran los mismos.
Estos son los archivos reales en el proyecto (en r12, en el momento de la escritura):
- La preferencia utilizando este ListView
- ListActivity con los oyentes y el adaptador
- El ListView actual
Espero que ayude a alguien más 🙂
- Android ListView child Ver setEnabled () y setClickable () no hacer nada
- SetOnItemClickListener en ListView personalizado
- Cómo personalizar listview row android
- Cómo crear listview con categorías / segmentos?
- Android AbsListView $ RecycleBin.addScrapView (AbsListView.java:6588)
- Android add view in listview
- ListView con imágenes y texto
- Android listview: adapter.add (item)? O adapter.notifyDataSetChanged ()
No hay ningún widget incorporado para hacer esto, pero puede que desee echar un vistazo a la implementación personalizada utilizada por el reproductor de música AOSP para permitir el reordenamiento de canciones en listas de reproducción.
TouchInterceptor.java
Esa es la clase que está extendiendo ListView y es responsable de manejar todos los MotionEvents y volver a ordenar sus elementos, así como detectar swipes para eliminar elementos. Puedes verlo implementado en una actividad aquí en la clase TrackBrowserActivity.java .
Tiene tres interfaces que también debe tener en cuenta: DragListener, DropListener y RemoveListener. Puede utilizar estas interfaces para proporcionarle devoluciones de llamada para esos eventos, de modo que pueda actualizar los cambios realizados en el orden de la lista a sus SavedPreferences (ya que ListView no lo manejará).
Puede ampliar o modificar fácilmente la clase TouchInterceptor para agregar funcionalidad adicional ya que las cosas de bajo nivel están disponibles para usted.
- Instancia de MediaPlayer: stop se comporta como una pausa
- ¿Se puede registrar una aplicación web progresiva como una opción de participación en Android?