Drag'n'Drop ConcurentModificationException

OnDragListener:

@Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_ENTERED: switch (v.getId()) { case R.id.delete_zone: { addToShowCaseZone.setImageDrawable(getResources().getDrawable(R.drawable.showcase_2)); inAddToShowcasesZone = true; break; } case MagazineGridAdapter.ID: { enteredView = v; break; } } return false; case DragEvent.ACTION_DRAG_EXITED: { switch (v.getId()) { case R.id.delete_zone: { addToShowCaseZone.setImageDrawable(getResources().getDrawable(R.drawable.showcase_1)); inAddToShowcasesZone = false; break; } case MagazineGridAdapter.ID: { enteredView = null; break; } } return true; } case DragEvent.ACTION_DRAG_STARTED: return true; case DragEvent.ACTION_DRAG_LOCATION: return false; case DragEvent.ACTION_DROP: { if (inAddToShowcasesZone) { final int position = gridView.getPositionForView(dragView); Magazine magazine = magazineAdapter.getItem(position); try { new Magazine(magazine.getUrl().toString(), magazine.getImage(), magazine.getBackgroundNum(), magazine.getName()); } catch (MalformedURLException e) { e.printStackTrace(); } addToShowCaseZone.setImageDrawable(getResources().getDrawable(R.drawable.showcase_1)); inAddToShowcasesZone = false; magazineAdapter.deleteFromList(position); return false; } else if(enteredView != null && !enteredView.equals(dragView)){ ResourcesForNativeMagazines.swapItems(gridView.getPositionForView(dragView), gridView.getPositionForView(enteredView), tabNumber - 1); magazineAdapter.refreshValues(ResourcesForNativeMagazines.getMagazines(tabNumber - 1)); enteredView = null; return false; } dragView.setVisibility(VISIBLE); return false; } default: dragView.setVisibility(VISIBLE); return true; } } 

Partes del adaptador:

 public void refreshValues(List<Magazine> magazines){ this.magazines = new ArrayList<>(magazines); notifyDataSetChanged(); } public void deleteFromList(int position){ magazines.remove(position); notifyDataSetChanged(); } 

A veces este código llama error en los métodos refreshValuews y deleteFromList cuando descargué el elemento, esto es stacktrace para él:

 java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806) at java.util.HashMap$KeyIterator.next(HashMap.java:833) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1172) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1174) at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:4911) at android.view.ViewRootImpl.access$700(ViewRootImpl.java:94) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3188) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

¿Cómo debo solucionarlo? ¿Hay alguna otra forma de modificar elementos dentro de gridView por drag'n'drop?

He encontrado una solución, no para causar una excepción que debe hacer a continuación:

 public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_ENDED:{ v.post(new Runnable{ public void run() { //SomeCode; } }); break; } } } 

ConcurrentModification Excepción se produce al intentar eliminar el elemento de la lista al mismo tiempo al iterar la lista.

Esto se puede resolver usando un iterador.

Así es como puede utilizar un iterador:

 Iterator<String> it = myArrayList.iterator(); while (it.hasNext()) { String str = it.next(); if (myCondition) it.remove(); } 

Consulte los enlaces que fluyen

¿Cómo evitar "ConcurrentModificationException" al eliminar elementos de `ArrayList` mientras lo itera?

Java: ConcurrentModificationException mientras itera sobre lista

  • Tamaño androide de la sombra del dragshadowbuilder
  • Cómo obtener las coordenadas X, Y correctas de un DragEvent.ACTION_DROP
  • Cómo arrastrar varias vistas de botón en java
  • OnDragListener - ¿hay alguna biblioteca de compatibilidad para niveles de Android <11?
  • ¿Cómo obtener la vista mientras arrastrar y soltar en android?
  • Cómo reproducir el archivo de audio Mp3 desde el servidor
  • Android: realizar arrastrar y soltar mediante programación
  • Android: Problema de arrastrar y soltar
  • Cómo cancelar View.OnDragListener en android durante la operación de arrastrar?
  • Leer WCF REST fecha de android
  • ¿Cómo se puede desplazar un "punto de destino" de Android drag-shadow de su "punto de contacto"?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.