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:
- Detenga OnLongClickListener disparando mientras arrastra
- Arrastrar y soltar Android ACTION_DRAG_ENDED no disparar
- Programaticamente finaliza un Android DragEvent
- Uso del marco de arrastrar y soltar de Android en Mi aplicación de inicio personalizado
- Arrastrar y soltar imágenes en android
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?
- Stackoverflow error en la vista
- Android scroll mientras arrastra y suelta
- Cambiar el tamaño de la zona de gota para destruir burbujas
- SetOnItemLongClickListener y setOnItemClickListener no se activan cuando se utiliza arrastre-ordenar-listview (DSLV)
- Cómo arrastrar varias vistas de botón en java
- Establecer anclaje personalizado al arrastrar una vista
- Android arrastrar y soltar / rotar mapa de bits en lienzo
- Bauerca drag-sort-listview ejemplo sencillo
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.
- Android 1.x Contacts.Extensions para un tipo de cuenta personalizada?
- Uso de la función gradleReference en cordova plugin.xml