Android ExpandableListView merkwürdige Probleme

mirisbowring

Bekanntes Mitglied
Hi,
seit ein paar Wochen bin ich dabei, eine Android app zu schreiben.

Unter anderem habe ich dort ein Fragment, auf dem ein ExpandableListView (ExVL) liegt.
Allerdings möchte ich nicht einfach ein TextView beim Ausklappen zeigen, sondern eine Tabelle.

Allerdings bekomme ich dort verschiedene Probleme, die ich seit etwa einer Woche nicht beheben kann:
1: Ich kann die Header auf und zuklappen, wie ich will. Wenn ich allerdings alle Header gleichzeitig offen habe, gibt er mir die Fehlermeldung:
Code:
The specified child already has a parent. You must call removeView() on the child's parent first.
Diese Fehlermeldung tritt aber nur auf, wenn alle anderen Header offen sind, und ich den obersten dann schließen möchte. Wie man auch in meiner Adapter Klasse sehen kann, rufe ich .removeAllViews(); auf, weshalb ich diese Fehlermeldung nicht ganz nachvollziehen kann...

2: In einer Methode (hängt auch an) bereite ich die Childs und parents vor. Unter anderem fülle ich eine List<TableRow> mit den Spalten, welche dann später der Tabelle zugefügt werden sollen. Diese List füge ich einer weiteren ArrayList hinzu, damit ich die sammeln kann (die Header anzahl ist dynamisch).

Nun habe ich allerdings das Problem, dass ich beim öffnen des Headers nicht eine Tabelle mit vielen Spalten habe, sondern viele Tabellen mit jeweils einer Spalte (die Daten sind dennoch nicht redundant).

Das sind die wichtigsten Probleme, bei denen ich echt Hilfe brauche :/

Hier noch die erwähnten Codes:
Java:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp">


    <TextView
        android:id="@+id/lblListHeader"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textSize="20dp"
        android:textColor="#000000" />

</LinearLayout>
Java:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/displayLinear"
    android:orientation="vertical" >

</TableLayout>
Java:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp"
    tools:context="com.example.expandablelistviewwithpultoreferesh.MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/chosen_date_student"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="20dp"
        android:textStyle="bold"
        android:textAlignment="center" />

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/studentswipe"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ExpandableListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/exLVStudent" />

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>
Java:
package com.example.arthurferdinand.newtz;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<TableRow>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<TableRow>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        View view = convertView;

        if (view == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = infalInflater.inflate(R.layout.list_item_table, parent, false);
        }

        TableRow childText = (TableRow)getChild(groupPosition, childPosition);

        TableLayout txtListChild = (TableLayout) view.findViewById(R.id.displayLinear);
        txtListChild.removeAllViews();
        txtListChild.addView(childText);

        return view;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        View view = convertView;

        if (view == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = infalInflater.inflate(R.layout.list_group, parent, false);
        }

        String headerTitle = (String) getGroup(groupPosition);
        TextView lblListHeader = (TextView) view.findViewById(R.id.lblListHeader);
        //lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return view;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}
Java:
listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<TableRow>>();

        //addingDataHeader
        //Hier werden die Zeilen gespeichert, aus denen wir später informationen ziehen
        ArrayList<Integer> dataLine = new ArrayList<>();
        //sql Date zu util Date
        ArrayList<Date> daten = new ArrayList<>();
        for(int i=0;i<Ugv.datum.size();i++){
            daten.add(Ugv.datum.get(i));
        }
        //parse Util.Date to String
        DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
        Date d;
        for(int i=0;i<Ugv.datum.size();i++){
            d = Ugv.datum.get(i);
            if(Ugv.actualDate.equals(df.format(d))){
                //Klasse wird gruppiert
                if(listDataHeader.isEmpty()){
                    if(Ugv.klasse.get(i).contains("~")) {
                        String[] parts = Ugv.klasse.get(i).split("~");
                        String klasse1 = parts[0];
                        String klasse2 = parts[1];
                        if (klasse1.contains("/")) {
                            String[] parts2 = klasse1.split("/");
                            String klasse21 = parts2[0];
                            String klasse22 = parts2[1];
                            listDataHeader.add(klasse21);
                            listDataHeader.add(klasse22);
                        } else if (klasse2.contains("/")) {
                            String[] parts2 = klasse2.split("/");
                            String klasse21 = parts2[0];
                            String klasse22 = parts2[1];
                            listDataHeader.add(klasse21);
                            listDataHeader.add(klasse22);
                        } else {
                            listDataHeader.add(klasse1);
                            listDataHeader.add(klasse2);
                        }
                    }else if(Ugv.klasse.get(i).contains("/")){
                        String[] parts = Ugv.klasse.get(i).split("/");
                        String eins = parts[0];
                        String zwei = parts[1];
                        listDataHeader.add(eins);
                        listDataHeader.add(zwei);
                    }else{
                        listDataHeader.add(Ugv.klasse.get(i));
                    }
                }else if(Ugv.klasse.get(i).contains("~")) {
                    String[] parts = Ugv.klasse.get(i).split("~");
                    String klasse1 = parts[0];
                    String klasse2 = parts[1];
                    if (klasse1.contains("/")) {
                        String[] parts2 = klasse1.split("/");
                        String klasse21 = parts2[0];
                        String klasse22 = parts2[1];
                        if (!listDataHeader.contains(klasse21)) {
                            listDataHeader.add(klasse21);
                        } else if (!listDataHeader.contains((klasse22))) {
                            listDataHeader.add(klasse22);
                        }
                    } else if (klasse2.contains("/")) {
                        String[] parts2 = klasse2.split("/");
                        String klasse21 = parts2[0];
                        String klasse22 = parts2[1];
                        if (!listDataHeader.contains(klasse21)) {
                            listDataHeader.add(klasse21);
                        } else if (!listDataHeader.contains((klasse22))) {
                            listDataHeader.add(klasse22);
                        }
                    } else {
                        if (!listDataHeader.contains(klasse1)) {
                            listDataHeader.add(klasse1);
                        } else if (!listDataHeader.contains((klasse2))) {
                            listDataHeader.add(klasse2);
                        }
                    }
                }else if(Ugv.klasse.get(i).contains("/")){
                    String[] parts = Ugv.klasse.get(i).split("/");
                    String eins = parts[0];
                    String zwei = parts[1];
                    if(!listDataHeader.contains(eins)){
                        listDataHeader.add(eins);
                    }else if(!listDataHeader.contains(zwei)){
                        listDataHeader.add(zwei);
                    }
                }else if(!listDataHeader.contains(Ugv.klasse.get(i))){
                    listDataHeader.add(Ugv.klasse.get(i));
                }
                dataLine.add(i);
            }
        }
        //hier werden alle Row Arrays gespeichert
        ArrayList<List<TableRow>> trCollect = new ArrayList<List<TableRow>>();
        //Hier werden alle Zeilen gespeichert, um anschließend dem childArray hinzugefügt werden zu können...
        List<TableRow> tr;
        String[] parts;
        //Klassen, die ~ enthalten
        String klasseW1 = null;
        String klasseW2 = null;
        String klasseW21 = null;
        String klasseW22 = null;
        //Klassen, die / enthalten
        String klasseS1 = null;
        String klasseS2 = null;
        String klasse = null;

        for(int i=0;i<listDataHeader.size();i++){
            tr = new ArrayList<TableRow>();
            for(int j=0;j<dataLine.size();j++) {
                if(Ugv.klasse.get(dataLine.get(j)).contains("~")) {
                    parts = Ugv.klasse.get(dataLine.get(j)).split("~");
                    klasseW1 = parts[0];
                    klasseW2 = parts[1];
                    if(klasseW1.contains("/")){
                        parts = Ugv.klasse.get(dataLine.get(j)).split("/");
                        klasseW21 = parts[0];
                        klasseW22 = parts[1];
                    }else if(klasseW2.contains("/")){
                        parts = Ugv.klasse.get(dataLine.get(j)).split("/");
                        klasseW21 = parts[0];
                        klasseW22 = parts[1];
                    }
                }else if(Ugv.klasse.get(dataLine.get(j)).contains("/")&& !Ugv.klasse.get(dataLine.get(j)).contains("~")){
                    parts = Ugv.klasse.get(dataLine.get(j)).split("/");
                    klasseS1 = parts[0];
                    klasseS2 = parts[1];
                }else{
                    klasse = Ugv.klasse.get(dataLine.get(j));
                }
                System.out.println(klasseS1 + klasseS2 + klasseW1 + klasseW2 + klasseW21 + klasseW22 + klasse);

                if(listDataHeader.get(i).equals(klasse)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseS1)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseS2)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseW1)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseW2)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseW21)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }else if(listDataHeader.get(i).equals(klasseW22)){
                    //eine Zeile wird erstellt, in die alle zueghörigen werte kommen
                    TableRow row = new TableRow(getActivity());
                    //jedes Textview gibt ein String bzw. Zelle wieder
                    TextView tv1 = new TextView(getActivity());
                    TextView tv2 = new TextView(getActivity());
                    TextView tv3 = new TextView(getActivity());
                    TextView tv4 = new TextView(getActivity());
                    TextView tv5 = new TextView(getActivity());
                    TextView tv6 = new TextView(getActivity());
                    TextView tv7 = new TextView(getActivity());
                    //TextView tv8 = new TextView(getActivity());
                    //Nun wird der Text den TextViews hinzugefügt
                    tv1.setText(String.valueOf(Ugv.stunde.get(dataLine.get(j))));
                    tv2.setText(Ugv.lehrerAlt.get(dataLine.get(j)));
                    tv3.setText(Ugv.fachAlt.get(dataLine.get(j)));
                    tv4.setText(Ugv.lehrerNeu.get(dataLine.get(j)));
                    tv5.setText(Ugv.fachNeu.get(dataLine.get(j)));
                    tv6.setText(Ugv.raumNeu.get(dataLine.get(j)));
                    tv7.setText(Ugv.vertretungsText.get(dataLine.get(j)));
                    //tv8.setText(Ugv.klasse.get(dataLine.get(j)));
                    row.addView(tv1);
                    row.addView(tv2);
                    row.addView(tv3);
                    row.addView(tv4);
                    row.addView(tv5);
                    row.addView(tv6);
                    row.addView(tv7);
                    //row.addView(tv8);
                    //Die Zeile wird dem row Array zugefügt
                    tr.add(row);
                }
            }
            trCollect.add(tr);
        }
        for(int b=0;b<listDataHeader.size();b++){
            listDataChild.put(listDataHeader.get(b), trCollect.get(b));
        }

Bei Fragen einfach nachfragen ;)

Falls ich etwas vergessen habe, einfach bescheid sagen

ich hoffe, einer von euch kennt eine Lösung :)

mirisbowring
 

buggy84

Bekanntes Mitglied
Ziemlich komplex geworden, was?
Wills6t du dein Projekt nochmal packen. Ich kanns mir dann heut abend mal ansehen.
Kannst mir den Link auch per PM schicken, wenn du willst.
 

mirisbowring

Bekanntes Mitglied
Wenn die APP offen ist, gehe einmal auf Schüler, öffne alle drei expandables und schließe dann das erste, während die anderen offen sind.

Dann sollte sie crashen (wenn man das erste einfach so auf und zu macht, ohne die anderen aufzuklappen, hat man keine Probleme)
 

buggy84

Bekanntes Mitglied
Das gepackte Projekt scheint nicht auf dem aktuellsten stand zu sein. Keine header.xml, keine ExpandableListView.xml kein customAdapter.java.

Bitte check das nochmal.
 

mirisbowring

Bekanntes Mitglied
Die sind vorhanden (unter einem anderen Namen)
header = list_group.xml
Das ExpandableListView ist in der student_layout.xml
CustomAdapter = ExpandableListAdapter.java
und die Tabelle (das Child) ist in der list_item_table.xml
 

buggy84

Bekanntes Mitglied
Ich kämpfe noch mit Deiner App :)
Die App stürzt ab, wenn die Datei Vertretung.txt noch nicht vorhanden ist. Duprüfst, ob die Datei existiert (vorbildlich), aber behandelst nicht den Fall, dass die Datei nicht existiert. Das Resultat ist eine NullPointerException... Die aber darauf berugt, dass Du einige ArrayLists nicht initialisierst (Diese werden nur initialisiert, wenn die Datei vorhanden ist).
Ich weiß jetzt auch nicht, wie sich die Sache verhält, wenn das Handy keine SDKarte hat, oder keine SD-Karte eingesetzt ist. Hier bietet es sich an, die Datei im Telefonspeicher abzulegen. Bei einer Text Datei ist Dir da normalerweise niemand böse.
 

mirisbowring

Bekanntes Mitglied
Also eigentlich wird die Datei ja im Root Verzeichnis abgelegt (ist bei mir so)
Da ich dort ja auch nen Ordner erstellt habe...

Das die Datei anfangs noch nicht vorhanden ist stimmt.
Du kannst sie allerdings herunterladen, wenn due bei Student einmal swipeRefreshst sozusagen...
Die wird dann ja runtergeladen (kann allerdings sein, dass die app dann abstürzt, weil ich die Methode, die danach aufgerufen wird noch nicht an das Table design angepasst habe)

es ging letztendlich schneller, wenn die Datei schon vorhanden ist, und damit dann gearbeitet werden soll.
 

mirisbowring

Bekanntes Mitglied
Nene die Datei wird ja vorher schon abgelegt, denn ich speichern die ja erst und lese sie dann mit nem buffered reader ein (eigentlich)
Die Datei müsste unter BEST SUB im root Verzeichnis zu finden sein (wenn du mit Windows da nach schauen willst, musst du das Handy erst neustarten (ist irgendwie nen allgemeiner Android bug)
 

mirisbowring

Bekanntes Mitglied
Tatsächlich...
ich prüfe in der Main Activity, ob die Datei vorhanden ist und fülle dann die Arrays.
Aber in der Student Klasse möchte ich Daten aus den Strings lesen, welche gar nicht vorhanden sind...

Ist mir bisher nicht aufgefallen, da immer eine Version der Datei auf dem Handy gespeichert war

(da musst du nur ne if schleife machen um den Thread)
 

buggy84

Bekanntes Mitglied
Bingo!
Ich bin noch dran, konnte gestern nichts machen, weil ich grad gesundheitlich nicht so ganz fit bin und mich abends ein wenig auskuriert habe. Übers Wochenende schaue ich mir deine App nochmal an.
 

buggy84

Bekanntes Mitglied
Ich hab ziemlich an deiner App rumgefummelt, um sie überhaupt erstmal auf einen Stand zu bringen, den ich brauche um den Fehler zu reproduzieren.
Kannst Du mir irgendwie visualieren, welches Ergebnis Du am Ende erwartest? Das, was ich jetzt sehe ist eher verwirrend für mich.

Grundsätzlich: Du hast viel Spaghetti-Code und extreme Abhängigkeiten in Deiner App gebaut. Ein Konstrukt, dass auf Deinem Handy gut funktionieren kann, auf allen anderen (wie z.b. auf meinem) aber gar nicht erst funktioniert. Da musst Du nacharbeiten. Ales ein bissl mehr Struktur geben. Ich komme auf Deinen Code auch ncoh nicht ganz klar, er ist relativ schwer zu warten. Du machst es Dir damit schwer, später Funktionen hinzuzufügen, da man leicht die Übersich verliert. Variablennamen wie "a" sollte man vermeiden, vor allem wenn es sich um eine Liste oder ein Array handelt, weil ich jetzt z.B. viel Aufwand dahingehend investiere, herauszufinden welche Daten da drinnen stehen. Das kostet Zeit und macht es sehr umständlich. Ich weiß Du bist Anfänger, und Du hast hier einen sehr guten Ansatz, dazu gehört eine ganze Menge an Arbeit und man muss Dir hier auch den entsprechenden Respekt zollen.

Wenn Du Deinen Code ein bisschen besser machst, fällt es Dir auch später leichter, Fehler selbst zu finden.

Estwas was Du dringend tun solltest:
Speichere Deine heruntergeladenen Daten nicht auf der SD-Karte ab. Speichere es auf dem Internal Storage ab. Den Zugriff hast Du immer. Die SD-Karte hast Du nicht immer... und wenn Du keine SD-Karte hast, bricht deine App zusammen(Stichwort Abhängigkeit... ).
http://developer.android.com/guide/topics/data/data-storage.html#filesInternal
 

mirisbowring

Bekanntes Mitglied
Danke erstmal, dass du dich so sehr damit beschäftigt hast...

den Spaghetti-Code habe ich nur vorübergehend so (später wird das eine Methode, die öfter aufgerufen wird), weil ich lediglich testen wollte, ob das so funktioniert, wie ich will :)
Genauso mit den variablen a, b, etc. (ich hatte keine Lust, mir logische Namen auszudenken, wenn ich die 5 min später eh wieder lösche, weil ich nen anderen Ansatz probiere )

Das mit dem SD-Karten abspeichern finde ich immer noch merkwürdig...
Denn zu Hause benutze ich 2 Handys für AS 1.5 (HTC Desire 500 und Huawei P8)
beim Desire habe ich eine SD Karte drin und beim Huawei nicht, dennoch schreibt die APP auf beiden Geräten den Ordner im Root Verzeichnis...

Im Anhang habe ich nen Bild, auf dem ich kurz skizziert habe, wie es aussehen soll...

Momentan ist es so wie links (wenn nur ein Expandable Ding offen ist) dann sind dort mehrere Zeilen
(allerdings ist jede Zeile eine eigene Tabelle, was man vor allem dann erkennt, wenn die row mal etwas länger ist, und man jede einzelne Zeile horizontal scrollen kann)

Allerdings möchte ich es wie rechts haben (keine Zeilentrennstriche, eine Tabelle und wenn da eine Zeile zu breit für den Bildschirm ist, möchte ich nicht nur diese eine Zeile bewegen, sondern gleich die ganze Tabelle)


Ich hatte mir ein neues Konzept überlegt (bin noch nicht dazu gekommen, es auszuprobieren durch meinen Zeitmangel im Moment):
Java:
for(int b=0;b<listDataHeader.size();b++){
            listDataChild.put(listDataHeader.get(b), trCollect.get(b));
        }

Mit der obigen Zeile rufe ich die getChildView Methode im Adapter so oft auf, wie groß die ArrayList tr bei b ist.
Nun hatte ich die Idee, dass ich trCollect in Ugv reinpacke und dann anstelle von trCollect.get(b); einfach die Anzahl der Rows (als Ziffer) dort benutze, die ich dann nicht mit anzeigen lasse.
Anschließend wird die GetChildView Methode im Adapter nur einmal aufgerufen (weil nu ein Element im Array vorhanden ist) und somit auch nur eine Tabelle erstellt. Allerdings fügt man dann in der getChildView Methode nich eine For Schleife ein, die dann so lauten müsste:
Java:
for(int i=0;i<rowAnzahlDieWirÜbergeben;i++){

}

Und darin für jedes i dann aus der ArrayList in Ugv lesen...
Somit hätten wir in einem Methjoden Aufruf die Tabelle erstellt, mit den entsprechenden rows. Danach wird die Methode erneut aufgerufen, allerdings für einenen anderen Header


Ich hoffe, du konntest mir folgen :)
 

Anhänge

  • IMG_20160206_222736.jpg
    IMG_20160206_222736.jpg
    2,6 MB · Aufrufe: 30

buggy84

Bekanntes Mitglied
Sorry, ich komme im Moment nicht dazu an Deiner App zu arbeiten. Hast Du inzwischen eine neue Version, dann würde ich mich freuen wenn Du mir die zukommen lassen könntest.

Ich habe ähnlich angefangen wie Du, erstmal irgendwas schreiben und schauen, ob die Sache auch so läuft wie ich mir das vorstelle, dann den Code umbauen. Das habe ich mir inzwischen abgewöhnt:

1. Den Code mehrmals anfassen nervt. Einmal richtig schreiben, dann passt das.
2. Code wird sehr schnell "Klüger als man selbst"... das bedeutet Du änderst hier was, da was, und ruckzuck weißt Du nicht mehr wo vorne und hinten ist. Du verlierst den Durchblick. Damit funktioniert Dein Code zwar irgendwann, Du kannst aber später nicht mehr sagen warum. Und eine kleine Änderung hat große Folgen. D.h. dein Code ist (und das ist der Stand im Moment) nur sehr schwer zu warten. Ich bin sogar dazu über gegangen, und das sage ich stolz, "fancy mathematics" wieder auf mehrere Zeilen auszudehnen, anstatt alles irgendwie in eine Zeile zu bringen, weil das wichtiger und klüger aussieht. Schreibe ich sowas in mehrere Zeilen, weiß ich nach mehreren Monaten noch, was ich eigentlich genau berechnen lassen wollte. Ähnlich verhält es sich mit Objekten und Methodenaufrufen. Das kostet mich vielleicht im Modul ein paar Codezeilen mehr, aber dafür "spricht" der Code mehr.
3. Oft geht man ein Problem schon von Anfang an zu kompliziert an. Oft genug hab ich markiert und gelöscht, um von vorn anzufangen. Teilt man ein Problem in mehrere Teilabschnitte, muss man nur die Teilprobleme lösen, nicht das große Ganze. Daher ist Spaghetticode eher eine schlechte Wahl.

Fazit: Einmal richtig machen, nicht zu faul sein für "a" auch mal eine Aussagekräftige Bezeichnung zu suchen. Ein großes Problem in Teilprobleme zerhacken und dieses auch direkt so programmieren.

In einem neuen Projekt, oder besser gesagt in einem neuen Modul, mache ich mir eine grobe Übersicht über das, was passieren muss und welches Handwerkszeug ich dafür habe oder noch benötige. Oft hilft mir dabei ein Ablaufplan, den ich auf Papier zeichne. Ich habe dieses hier zu meinem Liebling erkoren:
https://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
Hier beginne ich schon am Anfang zu werkeln und in vielen Fällen liegt dieses Diagramm auf meinem Tisch und ich verwandelt es nur noch in Code. Wenn es theoretisch auf dem Blatt funktioniert, klappt es meist auch im echten Code. Je besser, wenn man sich vorher viele Gedanken gemacht hat.

Ich würde Dir raten Deinen Code nochmal auf diese Gesichtspunkte hin zu überarbeiten, und mir dann nochmal eine Kopie zukommen zu lassen, wenn Du Dein Problem bis dahin nicht lösen konntest.

Ich möchte auch nicht nervig sein, aber überlege Dir bitte deine Datei nicht auf external zu speichern. Wenn man Gerüchten glauben mag, dann wird es mit Android 6 Handys geben, die absolut keinen Kartenslot mehr haben und sich eventuell auch nicht mehr als Massenspeicher anmelden lassen. Die Änderung jetzt erspart Dir Ärger in der Zukunft. Und es sind nur ein paar Zeilen Code.
 

mirisbowring

Bekanntes Mitglied
Danke für deine ausführliche Rückmeldung :)
Ich bin zur Zeit dabei, den Code ordentlich aufzuräumen und durch Methoden zu ersetzen...

Eines meiner beiden Probleme habe ich mittlerweile komplett gelöst, das andere irgendwie verändert:

Mit meiner oben beschriebenen Idee war ich in der Lage, alle Childs in eine Tabelle zu packen anstelle mehrere Tabellen unter einem Header.
Nun stürzt die APP auch nicht mehr ab, wenn ich den obersten Header betätige (wenn alle anderen offen sind)
Allerdings zeigt er mir nur einen Inhalt an:

Wenn ich den ersten Header betätige, zeigt er mir dort content an (beibden darauffolgenden aber nicht). Wenn ich einen der anderen Header als erstes öffne, hat der erste und die anderen kein child. Zudem wird immer das selbe child angezeigt...

Aber ich reduziere den Code erstmal
 

mirisbowring

Bekanntes Mitglied
Ich melde mich hier nocheinmal, um das Thema jetzt abzuschließen...

Die oben genannten Probleme konnte ich beheben. Allerdings sind dabei andere Fehler aufgetreten, die weder ich, noch mein Informatiklehrer nachvollziehen konnten...

Aus diesem Grund bin ich auf eine Normale Tabelle umgestiegen.

Die eigentlichen Header habe ich besonders hervorgehoben.

Jetzt funktioniert alles Reibungslos.


Dennoch vielen Dank für die Hilfe :)


mirisbowring
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
EisKaffee Android Mastering ExpandableListView WTF Android & Cross-Platform Mobile Apps 1
Streeber Android ExpandableListView Child-Auswahl speichern Android & Cross-Platform Mobile Apps 3
K Android ContextMenu auf Sub-Items in ExpandableListView Android & Cross-Platform Mobile Apps 2
F Android ExpandableListView und SimpleCursorTreeAdapter Android & Cross-Platform Mobile Apps 1
G merkwürdige Exception mit android und SQLLite Android & Cross-Platform Mobile Apps 18
J Android Probleme mit BLE-Notify Android & Cross-Platform Mobile Apps 2
J Android Probleme mit der Realm Datenbank Android & Cross-Platform Mobile Apps 3
J Android Probleme mit Navigation-Fragments? Android & Cross-Platform Mobile Apps 0
N Probleme mit custom dynamic ListView Android & Cross-Platform Mobile Apps 15
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
B Android Probleme mit Realm Datenbank Android & Cross-Platform Mobile Apps 2
B Android Probleme mit ArrayList Android & Cross-Platform Mobile Apps 6
J Android Probleme mit FileProvider Android & Cross-Platform Mobile Apps 1
B Probleme mit Firebase Authentication Android & Cross-Platform Mobile Apps 25
H Android Probleme mit SearchView in ArrayAdapter Android & Cross-Platform Mobile Apps 7
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Probleme beim Verbinden mit einer HTTPS Seite Android & Cross-Platform Mobile Apps 4
B Android Probleme mit RealmObject? Android & Cross-Platform Mobile Apps 1
F Probleme mit Google-Maps Android & Cross-Platform Mobile Apps 0
B Android Probleme mit ViewPager? Android & Cross-Platform Mobile Apps 5
J Probleme mit ViewPager und Activity Android & Cross-Platform Mobile Apps 1
B Android Probleme mit Eclipse? Android & Cross-Platform Mobile Apps 6
E MAVLINK Probleme Android & Cross-Platform Mobile Apps 1
C Android Probleme mit JavaMail Android & Cross-Platform Mobile Apps 5
B Android Probleme mit Facebook-SDK? Android & Cross-Platform Mobile Apps 1
D Android Probleme mit info/warning (1, 902) Android & Cross-Platform Mobile Apps 4
D Android Gallery Probleme Android & Cross-Platform Mobile Apps 3
B Probleme mit App auf Galaxy S3? Android & Cross-Platform Mobile Apps 13
S Hat der AVD-Manager Probleme mit GPS? Android & Cross-Platform Mobile Apps 5
P Probleme mit xml-Layout Android & Cross-Platform Mobile Apps 2
P Android Probleme mit Spinner Android & Cross-Platform Mobile Apps 3
F Layout mit listViews (Scrolling-Probleme) Android & Cross-Platform Mobile Apps 2
A Android Probleme mit Dialog Android & Cross-Platform Mobile Apps 4
U SQLite-Datenbank Probleme Android & Cross-Platform Mobile Apps 8
T Android Probleme bei Facebook Integration Android & Cross-Platform Mobile Apps 5
tfa Android Layout-Probleme: View programmatisch erweitern (addContentView) Android & Cross-Platform Mobile Apps 7
A Probleme mit ListView / ArrayAdapter Android & Cross-Platform Mobile Apps 3
A Probleme mit Form.isShown Android & Cross-Platform Mobile Apps 9
A Probleme mit Calendar auf dem Handy Android & Cross-Platform Mobile Apps 3
U Probleme mit der drawString Methode bei Canvas Android & Cross-Platform Mobile Apps 8
P Probleme mit dem Deployment Android & Cross-Platform Mobile Apps 3
P Probleme mit Streams Android & Cross-Platform Mobile Apps 4
C 2 kleine Probleme (Datei lesen, String durchsuchen) Android & Cross-Platform Mobile Apps 16
G Proguard Obfuscator macht Probleme Android & Cross-Platform Mobile Apps 2
P Probleme mit RMS Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen

Neue Themen


Oben