2017-03-12 4 views
0

Ich versuche, ein Element meiner ListView zu löschen, wenn ein Element vom Benutzer angeklickt wird, aber wenn der Benutzer darauf klickt, stürzt meine Anwendung ab und ich weiß nicht warum. HierLöschen eines Elements aus einer ListView in Android

ist der Code, der das Löschen des Elements, wenn es ausgewählt ist:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    tasques.remove(position); 
    notifyDataSetChanged(); 

} 

Hier ist die onCreate meiner mainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tasquesArrayList = new ArrayList<>(); 

    listView = (ListView) findViewById(R.id.listview); 

    ... 

    adapter = new tascaListViewAdapter(this,tasquesArrayList); 

    ... 

    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(adapter); 
    adapter.notifyDataSetChanged(); 

} 

Hier ist der Fehler:

Exception dispatching input event. 
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 
E/MessageQueue-JNI: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131492951, class android.widget.ListView) with Adapter(class edu.lasalle.pprog2.ac2.adapter.tascaListViewAdapter)] 
         at android.widget.ListView.layoutChildren(ListView.java:1618) 
         at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:3731) 
         at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:997) 
         at android.view.ViewRootImpl.ensureTouchModeLocally(ViewRootImpl.java:3744) 
         at android.view.ViewRootImpl.ensureTouchMode(ViewRootImpl.java:3728) 
         at android.view.ViewRootImpl$EarlyPostImeInputStage.processPointerEvent(ViewRootImpl.java:4244) 
         at android.view.ViewRootImpl$EarlyPostImeInputStage.onProcess(ViewRootImpl.java:4212) 
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) 
         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246) 
         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220) 
         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181) 
         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349) 
         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
         at android.os.MessageQueue.nativePollOnce(Native Method) 
         at android.os.MessageQueue.next(MessageQueue.java:323) 
         at android.os.Looper.loop(Looper.java:136) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: edu.lasalle.pprog2.ac2, PID: 3629 
        java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131492951, class android.widget.ListView) with Adapter(class edu.lasalle.pprog2.ac2.adapter.tascaListViewAdapter)] 
         at android.widget.ListView.layoutChildren(ListView.java:1618) 
         at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:3731) 
         at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:997) 
         at android.view.ViewRootImpl.ensureTouchModeLocally(ViewRootImpl.java:3744) 
         at android.view.ViewRootImpl.ensureTouchMode(ViewRootImpl.java:3728) 
         at android.view.ViewRootImpl$EarlyPostImeInputStage.processPointerEvent(ViewRootImpl.java:4244) 
         at android.view.ViewRootImpl$EarlyPostImeInputStage.onProcess(ViewRootImpl.java:4212) 
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) 
         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246) 
         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220) 
         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181) 
         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349) 
         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
         at android.os.MessageQueue.nativePollOnce(Native Method) 
         at android.os.MessageQueue.next(MessageQueue.java:323) 
         at android.os.Looper.loop(Looper.java:136) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Application terminated. 

Dank im Voraus!

+0

Können Sie das Fehlerprotokoll teilen? –

+0

@ZahidulIslam hat es getan :) – HessianMad

+0

Wie der Fehler sagt, haben Sie die Arraylist Daten außerhalb von Ihrer UI/Main Thread ändern. Überprüfen Sie, ob Sie das getan haben. –

Antwort

1

Fixed! Ich hatte eine andere adapter = new tascaListViewAdapter(this,tasquesArrayList); in einem anderen Teil meines Codes ...

1

versuchen Sie diesen Code: Benachrichtigen Sie den Adapter mit adapter.notifyDataSetChanged(); auch die vorherigen Daten ungültig.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    tasques.remove(position); 
    adapter.notifyDataSetChanged(); 
    adapter.notifyDataSetInvalidated(); 
} 
+0

Meine App das gleiche tun, stürzt ab, wenn ein Element ausgewählt ist ... :( – HessianMad

+0

nicht die ** gleiche ** ... müssen Sie den Adapter speziell – rafsanahmad007

+0

auch überprüfen, sollten Sie nicht verwenden: 'tasquesArrayList.remove (Position); ' – rafsanahmad007

Verwandte Themen