Android: Classcast wenn eine Kopfansicht ExpandableListView Hinzufügen
-
10-10-2019 - |
Frage
Ich versuche, einen Header zu einem ExpandableListView hinzufügen wie folgt:
headerView = View.inflate(this, R.layout.header, null);
expandableListView.addHeaderView(headerView);
expandableListView.setAdapter(new SectionedAdapter(this));
Was mir die folgenden Fehler gibt:
12-08 16:23:42.354:
ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504)
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490)
12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422)
12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)
Dies geschieht beim Aufruf zu expandableListView.setAdapter(new SectionedAdapter(this))
, aber ich kann nicht herausfinden, warum. Irgendwelche Ideen?
Lösung
Ok, dachte ich, dieses heraus. Ich habe von den Laufzeitfehlern befreien, indem programmatisch die Anzeige für den LayoutParams zu Listview LayoutParams Einstellung, etwa so:
headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));
vor der Ansicht hinzufügen.
: Der Grund dafür liegt in der Android-Dokumentation gefunden, die besagt, dass:
Diese Versorgungsparameter der Eltern dieser Ansicht angibt, wie sie angeordnet werden soll. Da sind viele Subklassen von ViewGroup.LayoutParams, und diese entsprechen den unterschiedlichen Subklassen von Viewgroup, die verantwortlich für die Organisation ihrer Kinder.
Also im Grunde, wenn man einen Blick auf einen anderen hinzufügen, um die LayoutParams der Blick auf den LayoutParams Typ festlegen müssen, dass die übergeordneten Anwendungen, oder Sie werden einen Laufzeitfehler erhalten.
Andere Tipps
Auch wenn die obige Antwort könnte für viele arbeiten, gibt es immer noch eine bessere Erklärung.
ClassCastException
ist das normale Verhalten nach listview.addHeaderView
oder listview.addFooterView
aufrufen.
Der Grund dafür ist, dass der anfängliche Adapter in den HeaderViewListAdapter
gewickelt ist.
Um Ihren Adapter diesen Code verwenden.
YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();
In meinem Fall hat nicht funktioniert. Ich hatte einen footerView meine Listview zu setzen, bevor es den Adapter setzen. Zuerst habe ich meinen initialisiert loadingView aus einer Layout-Datei in OnCreate Methode:
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);
Dann habe ich diese Abhilfe in der gleichen Methode:
this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);
Wo
private void setIsLoading(boolean isLoading)
{
this.isLoading = isLoading;
if (isLoading) {
listView.addFooterView(loadingView);
}
else {
listView.removeFooterView(loadingView);
}
}
Sie sollten Eltern im Hinblick auf Ihre aufgeblasene Ansicht setzen.
ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);