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?

War es hilfreich?

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

http://developer.android.com /reference/android/view/View.html#setLayoutParams(android.view.ViewGroup.LayoutParams)

, 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();

-Code von hier genommen

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top