webentwicklung-frage-antwort-db.com.de

ClassCastException mit ListView beim Ausführen von notifyDataSetChanged

Ich habe dem Header von listVivew eine Ansicht hinzugefügt,

    View TopSearch =  (View) View.inflate(this, R.layout.search, null);
    lv.addHeaderView(TopSearch, null, false);

Und alles ist in Ordnung, bis ich versuche auszuführen (wenn sich die Daten ändern)

adapter.notifyDataSetChanged();

Das bringt meine Anwendung immer zum Absturz und gibt mir folgenden Fehler:

> Java.lang.ClassCastException: Android.widget.HeaderViewListAdapter

Wenn ich die Header-Ansicht entferne, liegt kein Fehler vor. Irgendwelche Vorschläge? Vielen Dank.

38
bobetko

Wenn Sie in einer Listenansicht Kopf-/Fußzeilenansichten verwenden, wird Ihre Listenansicht mit einem HeaderViewListAdapter umhüllt. Sie können dies mit dem folgenden Code beheben:

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
124
Mark Pazon

API 18 und niedriger ist verwirrt darüber, was es verpackt. Um dies zu erleichtern, müssen Sie Ihren Kopf- und/oder Fußzeilen-PRIOR auf die Zuordnung des Adapters einstellen. Auf diese Weise erfolgt die korrekte Verpackung unter der Decke. Entfernen Sie anschließend sofort die Kopf-/Fußzeile (falls gewünscht).

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
12
Nebu

Wie in http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html geschrieben, sollte dies folgendermaßen geschehen:

HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
5
CoolMind

@ mussharapps Antwort ist vollkommen richtig und es funktioniert! Ich finde es jedoch bequemer, den Adapter für die spätere Verwendung einfach in einer Mitgliedsvariablen zwischenzuspeichern, bevor Sie setAdapter () ausführen:

mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
0
Carlos Ginés

Der Grund für die Klassenumwandlungsausnahme ist, dass die Listenansicht nicht in die Headerlistenansicht umgebrochen wurde. Daher können wir keine Fußzeilen oder Kopfzeilen direkt zur Listenansicht hinzufügen. Fügen Sie daher vor dem Einstellen des Adapters auf Listenansicht eine Dummy-Ansicht als Kopf- oder Fußzeilenansicht hinzu. Stellen Sie dann den Adapter auf Listenansicht. Dadurch wird die Listenansicht zur Instanz der Kopfzeilenliste. Anschließend können Sie ganz einfach Fußzeilen zur Listenansicht hinzufügen und daraus entfernen.

listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter): 

Nach dem Einstellen des Adapters können Sie die Fußzeile listview.addFooterView (yourFooter) hinzufügen oder entfernen. oder listview.removeFooterView (yourFooter);

0
sathish