Android ListView arrastrar y soltar para nido de abeja y ICS "Error: informe caída resultado: false"

He estado intentando crear un ListView que puedo clasificar usando arrastrar y soltar.

He intentado seguir la guía de Android aquí y algún código fuente proporcionado en Git aquí . Además, no quiero usar el ejemplo de la aplicación Música, ya que estoy tratando de usar las nuevas herramientas que se proporcionan en Honeycomb.

Hasta ahora he tenido éxito en la creación de la lista y puedo arrastrar los elementos. Desafortunadamente cuando caigo el artículo en la lista consigo el error siguiente:

"I / ViewRoot (22739): Informe resultado de la caída: falso".

Tengo una sospecha que mi oyente de la gota no se crea en el artículo derecho y así la gota nunca consigue llamada. Aquí está un código fuente, muchas gracias por su ayuda.

XML Para la lista:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dropTarget" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/list" > </ListView> </LinearLayout> 

Mi listView: Todavía no he podido entrar en el evento "ACTION_DROP" para que el código no se pruebe. Sólo algo en lo que estaba trabajando. Mi pregunta principal es que nunca entro en ACTION_DROP.

 public class procedureListView extends ListActivity { private ListView mListView = null; private ArrayAdapter<String> mArrayAdapter = null; private View layoutDropArea = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); String[] countries = getResources().getStringArray(R.array.arrayOfStuff); mArrayAdapter = new ArrayAdapter<String>(this, R.layout.list_item, countries); setListAdapter(mArrayAdapter); mListView = getListView(); mListView.setTextFilterEnabled(true); layoutDropArea = findViewById(R.id.dropTarget); setupDragDrop(); } /** * Setup what to do when we drag list items */ public void setupDragDrop(){ mListView.setOnItemLongClickListener(new OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long arg3){ String value = (String) ((TextView) v).getText(); ClipData data = ClipData.newPlainText("procedure", value); v.startDrag(data, new mDragShadowBuilder(v), null, 0); return true; } }); myDragListener mDragListener = new myDragListener(); //mListView.setOnDragListener(mDragListener); layoutDropArea.setOnDragListener(mDragListener); } protected class myDragListener implements OnDragListener{ public boolean onDrag(View v, DragEvent event) { final int action = event.getAction(); switch (action) { case DragEvent.ACTION_DRAG_ENTERED: v.setBackgroundColor(Color.GRAY); break; case DragEvent.ACTION_DRAG_EXITED: v.setBackgroundColor(Color.TRANSPARENT); break; case DragEvent.ACTION_DRAG_STARTED: break; case DragEvent.ACTION_DRAG_LOCATION: v.setVisibility(View.VISIBLE); // return processDragStarted(event); case DragEvent.ACTION_DROP: v.setBackgroundColor(Color.TRANSPARENT); int newPosition = mListView.getPositionForView(v); if (newPosition != ListView.INVALID_POSITION) return processDrop(event, newPosition); else return false; } return false; } } private boolean processDrop(DragEvent event, int newPosition) { ClipData data = event.getClipData(); if (data != null) { if (data.getItemCount() > 0) { Item item = data.getItemAt(0); String value = item.toString(); updateViewsAfterDropComplete(value, newPosition); return true; } } return false; } private void updateViewsAfterDropComplete(String listItem, int index) { Log.d("InsertItem", "Position: "+ index); mArrayAdapter.insert(listItem, index); mArrayAdapter.notifyDataSetChanged(); } private boolean processDragStarted(DragEvent event) { ClipDescription clipDesc = event.getClipDescription(); if (clipDesc != null) { return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN); } return false; } } 

¡Muchas gracias por tu ayuda!

ACTUALIZAR:

No pude entender por qué. Pero cuando cambié el caso del interruptor a esto, parecía trabajar:

 switch (action) { case DragEvent.ACTION_DRAG_ENTERED: //v.setBackgroundColor(Color.GRAY); return false; case DragEvent.ACTION_DRAG_EXITED: //v.setBackgroundColor(Color.TRANSPARENT); return true; case DragEvent.ACTION_DRAG_STARTED: return true; case DragEvent.ACTION_DRAG_LOCATION: //v.setVisibility(View.VISIBLE); return false; // return processDragStarted(event); case DragEvent.ACTION_DROP: v.setBackgroundColor(Color.TRANSPARENT); int newPosition = mListView.pointToPosition((int)(event.getX()),(int) event.getY()); Log.d("Position", Integer.toString(newPosition)); if (newPosition != ListView.INVALID_POSITION) return processDrop(event, newPosition); else return false; default: return true; } 

Su actualización corrigió el problema porque tiene que devolver true de onDrag cuando recibe DragEvent.ACTION_DRAG_STARTED para continuar recibiendo eventos de arrastrar a ese oyente. En su actualización devuelve true para este caso, por lo que continúa recibiendo eventos de arrastre y la lógica de caída funciona correctamente.

Si no devuelve true para el caso DragEvent.ACTION_DRAG_STARTED , su oyente no obtendrá ningún otro evento excepto DragEvent.ACTION_DRAG_ENDED .

  • Cómo obtener las coordenadas X, Y correctas de un DragEvent.ACTION_DROP
  • ListView Reordenable mediante arrastrar y soltar
  • Arrastre el elemento de lista desplegable en otro elemento
  • ¿Cómo obtener el objeto List View OnTouch?
  • Cómo arrastrar un elemento de un listview y dejarlo en un textView exterior?
  • Cómo arrastrar el TextView al destino correcto otro TextView
  • Establecer anclaje personalizado al arrastrar una vista
  • Cómo puedo arrastrar y soltar vistas en Android RelativeLayout
  • Android scroll mientras arrastra y suelta
  • Arrastrar y soltar, ListView y las vistas de elementos que pierden el evento ACTION_DRAG_STARTED
  • Bauerca drag-sort-listview ejemplo sencillo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.