2012-06-11 10 views
17

Estoy implementando arrastrar y soltar las vistas. Cuando se inicia la fricción, puse la visibilidad de la vista para INVISIBLE, entonces, si el arrastre se interrumpió - volver a VISIBLE:java.util.ConcurrentModificationException en View.setVisibility

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

Y:

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

Y cuando "Drag terminó" evento es llamado, estoy recibiendo una excepción:

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) 

¿Por qué y cómo solucionarlo?

+0

por qué, esta excepción se produce cuando está insertando o eliminando algún elemento de un iterable, cuando estás iterando sobre eso. pero parece ser un error en Android. –

+2

intente 'droppedView.post (nuevo Runnable() {public void run() {droppedView.setVisibility (View.VISIBLE);}});' tendrá que hacer que dropView final –

+0

sea solo una idea, pero ¿ha probado la API? demos? tienen un buen ejemplo de arrastrar y soltar allí. solo juegue con él y cambie la visibilidad exactamente cuando lo desee. dado que no tengo un dispositivo con API11 +, no puedo verificar si lo que hago ayuda (el emulador no es suficiente ya que a veces da resultados falsos) –

Respuesta

38

Puede probar este

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

Parece que sí Android tratando de acceder a la vista del estado, al mismo tiempo que terminan arrastrando.

EDITAR

explicación más precisa. Al configurar setVisibility(), está incluyendo o excluyendo View de la colección interna de vistas de Android, que debería responder a los eventos de arrastre. Esta colección se utiliza durante el envío de eventos de arrastre y, por lo tanto, al intentar setVisibility (en otras palabras, intentar modificar los detectores de eventos de arrastre) está causando ConcurrentModificationException

-2

Tal vez this puede ayudar. aquí en el enlace dado dice: en lugar de DragEvent.ACTION_DRAG_ENDED use DragEvent.ACTION_DROP.

+3

Necesito procesar la cancelación del arrastrar y soltar, cuando la vista no se cae. – arts777

Cuestiones relacionadas