Java Android ExpandableListView Alle Gruppen schließen bis auf aktuelle - java.lang.IndexOutOfBoundsException

Knito

Commander
Registriert
Sep. 2010
Beiträge
2.291
Hallo,
ich hangle mich grad als Java-Anfänger durch einige Tutorials und habe schon eine funktionierende ExpandableListView.

Ich möchte alle Gruppen schließen bis auf die aktuell geöffnete.

Ich habe verschiedene Beispiele ausprobiert, alle funktionieren gleich gut und enden mit dem selben Problem:

Wenn ich eine der geschlossenen Gruppen wieder öffnen möchte, schließt sich die App:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.add(ArrayList.java:483)
at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:685)
at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:708)
at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:668)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3228)
at android.widget.AbsListView$3.run(AbsListView.java:4204)
at android.os.Handler.handleCallback(Handler.java:891)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:7470)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

GRUPPEN-LISTENER

Java:
// setOnGroupClickListener listener for group heading click
simpleExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

        Log.d(String.valueOf(listAdapter.getGroupCount()),"xxxxxxxxxxxxxxxxxx");
        Log.d(String.valueOf(groupPosition),"yyyyyyyyyyyyyyyy");


        for (int g = 0; g < listAdapter.getGroupCount(); g++) {
            if (g != groupPosition) {
                simpleExpandableListView.collapseGroup(g);
            }
        }

        return false;

    }

});

Ich bin für alle Ideen dankbar.

Meine ausprobierten Beispiele von:
https://stackoverflow.com/questions...selected-group-in-expandable-listview-android

Mein ausprobiertes Tutorial: https://abhiandroid.com/ui/expandablelistview

CHILD-LISTENER

Java:
// setOnChildClickListener listener for child row click
simpleExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    @Override
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
      
      //get the group header


        GroupInfo headerInfo = deptList.get(groupPosition);

        //get the child info

        ChildInfo detailInfo =  headerInfo.getProductList().get(childPosition);


        for (int g = 0; g < listAdapter.getGroupCount(); g++) {
            if (g != groupPosition) {
                simpleExpandableListView.collapseGroup(g);
            }
        }


        TextView myTextView = (TextView)findViewById(R.id.ausgabeWerte);
        myTextView.setText(headerInfo.getName() + "\n" + detailInfo.getFarbe() + "\n" + detailInfo.getRezept());


        return false;


    }
});

Im Child-Listener funtkioniert es tadellos. Aber leider erst wenn man ein Child klickt.
 
Zuletzt bearbeitet:
Ist das echt die komplette Exception? Gibts da nicht noch weitere Infos? Man sieht gar nicht den Aufruf der Methode für den GroupClickListener. :( Auf jeden Fall scheint die Android-Klasse ExpandableListConnector die Methode expandGroup aufzurufen und dort wird in eine ArrayList bei Position 1 eingefügt, obwohl die Liste leer ist und bei Position 0 eingefügt werden sollte. Vielleicht hilft dir die Info etwas um einen Workaround zu basteln? Ansonsten vielleicht die ganze Klasse mal bei Pastebin hochladen
 
Danke werde ich mir morgen mal anschauen.
Der ganze Code ist hier aus dem Tutorial beginnend mit
"Step 1: Create a new project and name it ExpandableListViewExample"
https://abhiandroid.com/ui/expandablelistview

Den Fehler hab ich direkt aus dem Catlog beim Android Studio kopiert.
Mir mangelt es noch ein bischen am Grundverständnis, ich hatte gedacht das "collapseGroup" also das Zusammenklappen nur kosmetischer Natur ist.
 
Also ich kenne mich mit Android nicht all zu gut aus, aber ich versuche mal zu helfen.
Das Zusammenklappen ist zwar kosmetisch, aber dafür handled Android intern anscheinend eine Liste (ArrayList), um sich zu merken, welche Gruppen offen sind, und welche nicht. Aber daran können wir natürlich nichts ändern.

Die Methode funktioniert ja im Child-Listener. Ich könnte mir also vorstellen, dass das Iterieren über die Group-Liste im Group-Listener selbst Probleme macht, weil sich die Menge der offenen Gruppen genau in dem Moment ändert, in welchem der Listener intern nach den offenen Gruppen prüft. Ob eine Gruppe geöffnet ist wird in der Methode simpleExpandableListView.collapseGroup(g) geprüft (siehe hier)

Returns
boolean True if the group was collapsed, false otherwise (if the group was already collapsed, this will return false)

Also musst du dir Gedanken machen, wie man das umgeht. Eine Alternative könnte auch sein, dir in einer Klassenvariable zu merken, welche Gruppe zuletzt geöffnet war (bzw. angeklickt wurde) und schließt dann einfach immer nur die vorherige Gruppe. Dadurch umgehst du die Schleife.
 
Ich will deine Lust, dich mit der Android-Entwicklung zu beschäftigen nicht schmälern. muss aber zuerst etwas loswerden. :D ListViews werden seit es RecyclerView gibt (wurde 2014 vorgestellt) praktisch nicht mehr verwendet. Dein Tutorial ist auch 3,5 Jahre alt.

Daher ist mein Rat für dein nächstes Projekt, dir in jedem Fall RecyclerViews anzuschauen. Fall du das ganze nur hobbymäßig machst und nicht den Anspruch hast, das irgendwann mal professioneller zu machen, kannst du meinen Kommentar gerne ignorieren.

Ansonsten kann ich anhand deiner Code-Auszüge leider den Fehler auch nicht ableiten.:(
 
Zuletzt bearbeitet:
Zurück
Oben