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; } 

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); 
  • Implementar Drag & Drop en pan de jengibre
  • Cómo crear una sombra de arrastre personalizada?
  • No se puede arrastrar y soltar una imagen simple en el estudio android
  • Cómo hacer que los elementos de la lista obtengan DragEvents después de desplazarse
  • Drag and Drop + Fling Detector no funciona
  • Cómo arrastrar el TextView al destino correcto otro TextView
  • Arrastrar y soltar en un `ListView`
  • Arrastrar y soltar imágenes en android
  • Cómo hacer que el TextView arrastre en LinearLayout suave, en android?
  • Drag'n'Drop ConcurentModificationException
  • La mejor manera de reordenar elementos en Android 4 + ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.