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:
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:
Bei Fragen einfach nachfragen
Falls ich etwas vergessen habe, einfach bescheid sagen
ich hoffe, einer von euch kennt eine Lösung
mirisbowring
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.
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