2012-06-20 22 views
5

Estaba buscando una ListPreference en la que el usuario puede cambiar el orden de los elementos de una lista. Los elementos serían arrastrables y el usuario puede reordenarlos.¿Cómo hacer un ListView con elementos que se pueden arrastrar?

Vi esto en mi ROM personalizada (y estoy casi seguro de haberlo visto en Cyanogenmod) para el QuickPanel. Aquí hay una captura de pantalla para conseguir la idea a través de:

Screenshot of the "widget Button Order" in QuickPanel Settings of Sabotage ROM

sé lo que puedo hacer que los elementos de ListView costumbre y establecer el icono para indicar que los artículos se pueden arrastrar, pero no sé cómo hacer que se pueda arrastrar y cambia el orden en consecuencia. En cuanto a guardarlos en las preferencias, encontré this que podría implementarse fácilmente.

PS: Sé CyanogenMod es de código abierto, pero no pude encontrar la fuente de esta cosa en particular :(Lo más cerca que pude conseguir fue this, que debe estar en algún lugar cerca de la otra pantalla ...

Gracias de antemano por cualquier consejo sobre este

ACTUALIZACIÓN:. terminé usando los archivos de la respuesta aceptada, con las adiciones y modificaciones que les estoy enumerando aquí para mayor referencia

    ..
  • Use 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 hace eso automáticamente. Y depende del adaptador que esté usando.

  • Hubo una línea que arrojó una Vista a un Grupo de Vista, cometió algunos errores, por lo que quité el elenco sin ningún problema, no fue necesario. (en el método onInterceptTouchEvent).

  • Cambie mRemoveMode = 1; en el constructor de TouchInterceptor, o uno de: FLING = 0; SLIDE = 1; TRASH = 2;. Creo que para TRASH, un recurso debería estar disponible también.

De hecho, me tomó el archivo no desde el enlace de la respuesta, pero desde el CyanogenMod uno, que ya tenía, pero supongo que estos archivos son los mismos.

Estos son los archivos reales en el proyecto (al R12, en el momento de la escritura):

espero que ayude a otra persona :)

+0

No hay una función estándar para esto, por lo que debe anular la función Toque y detectar el evento táctil. Probablemente su anulación esté activada por un evento longClick; de lo contrario, no sabrá si el usuario desea arrastrar un elemento o desplazarse por la lista. – Christine

+0

@Christine ¿No puedo usar [OnDragListener] (http://developer.android.com/reference/android/view/View.OnDragListener.html)? – jadkik94

+0

@ jadkik94 Hola. Estoy tratando de implementar lo mismo usando estos archivos. Pero dado que es una pregunta bastante antigua, me preguntaba si existe o no un método mejor o más conveniente para implementar una lista que se pueda arrastrar. No pude encontrar ninguno sin embargo. Apreciará cualquier sugerencia que pueda dar ... Gracias. – Anjani

Respuesta

5

No hay un widget incorporado para hacer esto, pero es posible que desee echar un vistazo a la implementación personalizada utilizada por el reproductor de música AOSP para permitir el reordenamiento de las canciones en las listas de reproducción.

TouchInterceptor.java

Esa es la clase que se está extendiendo ListView y es responsable del manejo de todos los MotionEvents y cambiando el orden de sus elementos, así como la detección de golpes para la eliminación de elementos. Puede 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 usar estas interfaces para proporcionar devoluciones de llamadas para esos eventos, para que pueda actualizar los cambios realizados en el orden de la lista a sus Preferenciasguardadas (ya que ListView no lo manejará).

Puede ampliar o modificar fácilmente la clase TouchInterceptor para agregar funcionalidad adicional, ya que todo lo de bajo nivel está a su alcance.

+0

Correcto, sabía que lo había visto en otro lado, ¿por qué no pensé en esto? Es extraño que no usen los eventos de arrastrar y soltar como [en los documentos] (http://developer.android.com/guide/topics/ui/drag-drop.html). De todos modos, nunca podría haber hecho esto solo. Gracias, lo intentaré y te responderé. – jadkik94

+0

La API de arrastrar y soltar se agregó en el nivel 11 de la API, y esta implementación se dirige al nivel 8 de la API, por lo que probablemente se escribió antes de que la API se completara o estuviera ampliamente disponible. – Victor

+0

Eso podría ser. Acabo de notar algo, ¿estás seguro de que la clase TouchInterceptor se usa en MusicPicker.java? Esa clase no se importa/usa allí. – jadkik94

Cuestiones relacionadas