Android scroll mientras arrastra y suelta
Hola estoy tratando de hacer un arrastrar y soltar en un ListView. Funciona muy bien. Pero perdí la capacidad de hacer clic y desplazarse. ¿Cómo conservar esos dos? Yo estaba thinkng la arrastrar y soltar debería suceder en la prensa larga del artículo en lugar de una prensa normal. Aquí está mi onTouch que se encuentra en MyListView que extiende ListView
@Override public boolean onTouchEvent(MotionEvent ev) { final int action = ev.getAction(); final int x = (int) ev.getX(); final int y = (int) ev.getY(); if (action == MotionEvent.ACTION_DOWN && x < this.getWidth()/4) { this._dragMode = true; } if (!this._isDragNDrop) return super.onTouchEvent(ev); switch (action) { case MotionEvent.ACTION_DOWN: this._startPosition = pointToPosition(x,y); if (this._startPosition != INVALID_POSITION) { int mItemPosition = this._startPosition - getFirstVisiblePosition(); this._dragPointOffset = y - getChildAt(mItemPosition).getTop(); this._dragPointOffset -= ((int)ev.getRawY()) - y; startDrag(mItemPosition,y); drag(x,y); } break; case MotionEvent.ACTION_MOVE: drag(x,y); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: default: this._dragMode = false; //_isDragNDrop = false; this._endPosition = pointToPosition(x,y); stopDrag(this._startPosition - getFirstVisiblePosition()); if (this._dropListener != null && this._startPosition != INVALID_POSITION && this._endPosition != INVALID_POSITION) this._dropListener.onDrop(this._startPosition, this._endPosition); break; } return true; }
- ¿Cómo se puede desplazar un "punto de destino" de Android drag-shadow de su "punto de contacto"?
- Arrastrar y soltar iconos a la pantalla de inicio
- Programaticamente finaliza un Android DragEvent
- Implementar deslizar en ListView
- OnDragListener - ¿hay alguna biblioteca de compatibilidad para niveles de Android <11?
- Stackoverflow error en la vista
- ¿Cómo obtener el objeto List View OnTouch?
- Android - arrastrar y soltar - reorganizar la lista
- Ordenar los elementos de una visita de reciclaje mediante arrastrar y soltar
- ¿Cómo puedo arrastrar y soltar varias vistas de imagen sobre otras vistas de imagen de Android
- Android: realizar arrastrar y soltar mediante programación
- Cómo detener otras imágenes para moverse mientras arrastra una imagen
- Arrastrar y soltar en GridView en Android
Acabo de implementar arrastrar y soltar la vista de lista en mi aplicación, el arrastre comienza por presionar un elemento.
El código fuente está en GitHub: DraggableListView , tengo una entrada en el blog para describirlo. Espero que te ayude.
Estoy implementando algo similar. Espero que esto ayudará a alguien más como todavía estoy planchar las torceduras.
... thumb.setOnDragListener(new Drag()); ... public class Drag implements OnDragListener{ public static int PositionOfDraggedItem = -1; public int PositionOfItemDraggedOver = -1; public Drag() {} @Override public boolean onDrag(View v, DragEvent event) { final int action = event.getAction(); boolean state = true; View root = v.getRootView(); ListView List = (ListView) root.findViewById(android.R.id.list); Object holder = v.getTag() instanceof OrderHolder? (OrderHolder)v.getTag() : v.getTag(); String BookId = holder instanceof OrderHolder? String.valueOf(((OrderHolder)holder).id) : (String)holder; switch(action) { case DragEvent.ACTION_DRAG_STARTED: break; case DragEvent.ACTION_DRAG_ENTERED: if( PositionOfDraggedItem != -1 ) { if( this.PositionOfItemDraggedOver != PositionOfDraggedItem ) { if( v.getBackground() != null ) v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row_ovr)); } } break; case DragEvent.ACTION_DRAG_LOCATION: /** * Set the item being * here, as it will not * provide location data * anywhere else */ if( PositionOfDraggedItem == -1 ) PositionOfDraggedItem = List.getPositionForView(v); /** * Set the view thats * being dragged over */ this.PositionOfItemDraggedOver = List.getPositionForView(v); int PositionOfLastVisibleView = List.getLastVisiblePosition(); int PositionOfFirstVisibleView = List.getFirstVisiblePosition(); if( this.PositionOfItemDraggedOver != -1 && ( this.PositionOfItemDraggedOver != PositionOfDraggedItem ) ){ if( this.PositionOfItemDraggedOver == PositionOfLastVisibleView-1 || this.PositionOfItemDraggedOver == PositionOfLastVisibleView || this.PositionOfItemDraggedOver == PositionOfLastVisibleView+1 ){ List.smoothScrollToPosition(PositionOfLastVisibleView+1); }else if( this.PositionOfItemDraggedOver == PositionOfFirstVisibleView-1 || this.PositionOfItemDraggedOver == PositionOfFirstVisibleView+1 || this.PositionOfItemDraggedOver == PositionOfFirstVisibleView ){ List.smoothScrollToPosition(PositionOfFirstVisibleView-1); } } break; case DragEvent.ACTION_DRAG_EXITED: if( v.getBackground() != null ) v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row)); break; case DragEvent.ACTION_DROP: if(event != null) { ClipData data = event.getClipData(); if( data != null && data.getItemCount() > 0 ) { if( !data.getItemAt(0).getText().toString().equalsIgnoreCase(BookId) ) { if( v.getBackground() != null ) v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row)); /** * Ordering info for * book being dragged */ String oShelfOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_SHELFORDER, booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(data.getItemAt(0).getText().toString())); String oBookOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_BOOKSORDER, booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(data.getItemAt(0).getText().toString())); /** * Ordering info * for book being dragged * to */ String dShelfOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_SHELFORDER, booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(BookId)); String dBookOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_BOOKSORDER, booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(BookId)); /** * Update book being dragged */ ContentValues args = new ContentValues(); args.put(dbhelper.BOOKS_SHELFORDER, dShelfOrder); args.put(dbhelper.BOOKS_BOOKSORDER, dBookOrder); BookManager.updateBook(v.getContext().getContentResolver(), data.getItemAt(0).getText().toString(), args); /** * Update book being dragged to */ ContentValues values = new ContentValues(); values.put(dbhelper.BOOKS_SHELFORDER, oShelfOrder); values.put(dbhelper.BOOKS_BOOKSORDER, oBookOrder); BookManager.updateBook(v.getContext().getContentResolver(), BookId, values); if( v.getContext() instanceof OrderBooks ){ ((OrderBooks)v.getContext()).adapter.refresh(); ((OrderBooks)v.getContext()).adapter.notifyDataSetChanged(); PositionOfDraggedItem = -1; } } } } break; case DragEvent.ACTION_DRAG_ENDED: if( event != null && event.getResult()) { v.invalidate(); } break; } return state; }
}
No han trabajado en él en un tiempo, actualizado para reflejar los últimos cambios.
Consulta esta pregunta para obtener ayuda adicional. También tengo un componente llamado DragSortListView que he pasado mucho tiempo refinando. Lo puedes encontrar aquí:
Podría ayudarle a integrar la prensa de largo arrastre arrastrando en un tenedor de mi repo anterior.
He implementado esta solución que funciona para mí. El siguiente método está en mi actividad y se llama en mi dragEventListener cuando el dragEvent es ACTION_DRAG_ENTERED. Algunos atributos que declaré:
//first visible item (getFirstVisiblePosition() does not work for me) int firstVisible; //number of scrolls int nbrScroll; //my listview to scroll ListView mListView; //the adapter of my listview SimpleAdapter mAdapter;
…
public void scrollDrag(int position) { //this is the position of the item in my listview //to scroll down //test if the item entered is the last visible if (position == mListView.getLastVisiblePosition() && id < mListView.getCount()) { mAdapter.notifyDataSetChanged(); mRightDrawerList.post(new Runnable() { @Override public void run() { //scroll down mListView.smoothScrollToPosition(mListView .getLastVisiblePosition() + 1); firstVisible++; } }); //to scroll up //test if the item entered is the first visible } else if (position == firstVisible && position !=0) { mAdapter.notifyDataSetChanged(); mListView.post(new Runnable() { @Override public void run() { //scroll up mListView.smoothScrollToPosition(firstVisible-1); firstVisible --; } }); } }
Espero que ayude a alguien.
Él chicos he hecho poco cambio en el código de rickey y es trabajo para mí.
if (PositionOfItemDraggedOver == PositionOfLastVisibleView) order_item_list_lv.smoothScrollToPosition(PositionOfLastVisibleView + 1); if (PositionOfItemDraggedOver == PositionOfFirstVisibleView) order_item_list_lv.smoothScrollToPosition(PositionOfFirstVisibleView - 1);
- Cómo reducir y comprimir un archivo apk en android
- ¿Cómo implementar un reinicio de MediaPlayer en errores en Android?