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;

    }
}

Adapter parts:

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

public void deleteFromList(int position){
    magazines.remove(position);
    notifyDataSetChanged();
}

Sometimes this code causes an error in the refreshValuews and deleteFromList methods, when I deleted an element, stacktrace is used for this:

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)

How should I fix this? Is there any other way to change the elements inside the gridView using drag'n'drop?

+4
source share
2 answers

I found a solution so as not to throw an exception, which you should make as follows:

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

ConcurrentModification An exception occurs when you try to remove an item from the list at the same time when you repeat the list.

This can be solved using Iterator.

Here's how you can use an iterator:

Iterator<String> it = myArrayList.iterator();

while (it.hasNext()) {
    String str = it.next();

    if (myCondition)
        it.remove();
}

Refer to current links

"ConcurrentModificationException" `ArrayList` ?

Java: ConcurrentModificationException

0

All Articles