Java.util.ConcurrentModificationException в View.setVisibility

Я использую drag'n'drop для просмотров. Когда начато перетаскивание, я устанавливаю видимость представления на INVISIBLE , затем, если перетаскивание было прервано – обратно в VISIBLE :

 public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // Skipped some code boolean dragStarted = v.startDrag(data, shadowBuilder, v, 0); if (dragStarted) { v.setVisibility(View.INVISIBLE) } } } 

А также:

 if (event.getAction() == DragEvent.ACTION_DRAG_ENDED) { View droppedView = (View) event.getLocalState(); droppedView.setVisibility(View.VISIBLE); } 

И когда вызывается событие «Перетащить конец», я получаю исключение:

 E/AndroidRuntime(7118): FATAL EXCEPTION: main E/AndroidRuntime(7118): java.util.ConcurrentModificationException E/AndroidRuntime(7118): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:792) E/AndroidRuntime(7118): at java.util.HashMap$KeyIterator.next(HashMap.java:819) E/AndroidRuntime(7118): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1046) E/AndroidRuntime(7118): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1048) E/AndroidRuntime(7118): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1048) E/AndroidRuntime(7118): at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1048) E/AndroidRuntime(7118): at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:3471) E/AndroidRuntime(7118): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2620) E/AndroidRuntime(7118): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(7118): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(7118): at android.app.ActivityThread.main(ActivityThread.java:4575) E/AndroidRuntime(7118): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(7118): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(7118): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) E/AndroidRuntime(7118): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) E/AndroidRuntime(7118): at dalvik.system.NativeStart.main(NativeMethod) 

Почему и как это исправить?

Solutions Collecting From Web of "Java.util.ConcurrentModificationException в View.setVisibility"

Вы можете попробовать это

 if (event.getAction() == DragEvent.ACTION_DRAG_ENDED) { final View droppedView = (View) event.getLocalState(); droppedView.post(new Runnable(){ @Override public void run() { droppedView.setVisibility(View.VISIBLE); } }); } 

Похоже, что сам Android пытается получить доступ к представлению в то же время, когда вы закончите перетаскивание.

РЕДАКТИРОВАТЬ

Более точное объяснение. Установив setVisibility() , вы включаете или исключаете View из внутренней коллекции представлений Android, которая должна реагировать на события перетаскивания. Эта коллекция используется при отправке событий перетаскивания, и поэтому, пытаясь setVisibility (другими словами, пытаясь изменить прослушиватели событий перетаскивания), вы вызываете ConcurrentModificationException

Может быть, это может помочь. Здесь в данной ссылке говорится: вместо DragEvent.ACTION_DRAG_ENDED используйте DragEvent.ACTION_DROP .