Arrastre el elemento de lista desplegable en otro elemento

Tengo una vista de la lista con diversos tipos del artículo: cabecera, carpeta y archivo como esto:

Introduzca aquí la descripción de la imagen

Ahora me gustaría implementar el elemento de archivo de arrastrar y colocarlo en el elemento de la carpeta y obtener la fuente y la posición de destino. No quiero cambiar la posición de destino (reorganizar) al arrastrar como algunas bibliotecas de vista de lista de clasificación de arrastre.

¿Hay alguna sugerencia para empezar?

Cambiar su ListView a RecyclerView hará las cosas mucho más fáciles.

Puedes encontrar todo el artículo sobre Styling Android y el código completo aquí.

Este código utiliza OnItemTouchListener para detectar cuando se debe arrastrar un elemento. Hay un ImageView encima del RecyclerView con una imagen del elemento que se está moviendo para animarlo de forma barata.

El OnItemTouckListener ( DragController.java ):

 public class DragController implements RecyclerView.OnItemTouchListener { private RecyclerView recyclerView; private ImageView overlay; private final GestureDetectorCompat gestureDetector; private boolean isDragging = false; public DragController(RecyclerView recyclerView, ImageView overlay) { this.recyclerView = recyclerView; this.overlay = overlay; GestureDetector.SimpleOnGestureListener longClickGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public void onLongPress(MotionEvent e) { super.onLongPress(e); isDragging = true; dragStart(e.getX(), e.getY()); } }; this.gestureDetector = new GestureDetectorCompat(recyclerView.getContext(), longClickGestureListener); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { if (isDragging) { return true; } gestureDetector.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { int x = (int) e.getX(); int y = (int) e.getY(); View view = recyclerView.findChildViewUnder(x, y); if (e.getAction() == MotionEvent.ACTION_UP) { dragEnd(view); isDragging = false; } else { drag(y, view); } } 

Inicio y finalización del arrastre ( DragController.java ):

 private boolean isFirst = true; private static final int ANIMATION_DURATION = 100; private int draggingItem = -1; private float startY = 0f; private Rect startBounds = null; private void dragStart(float x, float y) { View draggingView = recyclerView.findChildViewUnder(x, y); View first = recyclerView.getChildAt(0); isFirst = draggingView == first; startY = (y - draggingView.getTop()); paintViewToOverlay(draggingView); overlay.setTranslationY(y - startY); draggingView.setVisibility(View.INVISIBLE); draggingItem = recyclerView.indexOfChild(draggingView); startBounds = new Rect(draggingView.getLeft(), draggingView.getTop(), draggingView.getRight(), draggingView.getBottom()); } private void drag(int y, View view) { overlay.setTranslationY(y - startY); } private void dragEnd(View view) { overlay.setImageBitmap(null); view.setVisibility(View.VISIBLE); view.setTranslationY(overlay.getTranslationY() - view.getTop()); view.animate().translationY(0f).setDuration(ANIMATION_DURATION).start(); } private void paintViewToOverlay(View view) { Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); overlay.setImageBitmap(bitmap); overlay.setTop(0); } 

El código está escrito por Mark Allison en StylingAndroid.

Editar:

Pero no sé cómo conseguir la posición del artículo cuando el arrastrar es extremo

La respuesta se encuentra en la parte 7 de Styling Android.

 View view = recyclerView.findChildViewUnder(0, y); 

¿Y cómo puedo inhabilitar la fricción en el artículo de la carpeta y de la cabecera? Sólo permite arrastrar el elemento de archivo?

Puede hacerlo utilizando varios ViewTypes (archivo, carpeta y encabezado). A continuación, puede utilizar getItemViewType en DragController para iniciar el movimiento sólo para los archivos.

  • Drag and Drop + Fling Detector no funciona
  • PopupWindow no responde a los eventos de arrastrar y colocar
  • Arrastrar y soltar para poner elementos de List1 a List2
  • Arrastrar y soltar listitem de un listview a otro listo de listview
  • Ayuda con los problemas de ListView de la interfaz de usuario de Android
  • Android - Restringir arrastrar y soltar a un cuadro delimitador
  • Arrastrar y soltar, ListView y las vistas de elementos que pierden el evento ACTION_DRAG_STARTED
  • ¿Cómo obtener el objeto List View OnTouch?
  • Cómo arrastrar un elemento de un listview y dejarlo en un textView exterior?
  • Android ListView arrastrar y soltar para nido de abeja y ICS "Error: informe caída resultado: false"
  • ¿Cómo obtener el comportamiento de pantalla de inicio de arrastrar a bin, en mi propia aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.