2012-09-29 7 views
8

Ich habe eine Ausnahme, von der ich nie gedacht hätte, dass ich sie sehen würde. Eine Klassenausnahme des Adapters beim Entfernen einer Fußzeilenansicht von einer ListView (sic).Adapterklassen-Cast-Ausnahme beim Entfernen einer Fußzeilenansicht?

java.lang.ClassCastException: com.test.MyAdapter 
at android.widget.ListView.removeFooterView(ListView.java:381) 

Wie kann das passieren? Was hat das Entfernen einer Fußzeile mit einer Klassenausnahme zu tun?

Die Liste ist ein Multi-Liste-Adapter vielleicht deshalb, aber immer noch eine Klasse Cast-Ausnahme zum Entfernen einer Fußzeile (sic).

Antwort

12

Fügen Sie Ihre Fußzeilenansicht zu ListView hinzu, bevor Sie die Methode setAdapter() aufrufen.

Hinzugefügt:

public void addFooterView (View v) 

seit: API Ebene 1 eine feste Ansicht hinzufügen am Ende der Liste angezeigt werden. Wenn addFooterView mehrmals aufgerufen wird, werden die Ansichten in der Reihenfolge angezeigt, in der sie hinzugefügt wurden. Mit diesem Aufruf hinzugefügte Ansichten können den Fokus verwenden, wenn sie möchten.

HINWEIS: Rufen Sie dies auf, bevor Sie setAdapter aufrufen. Dies ist so, dass ListView den gelieferten Cursor mit einem umbrechen kann, der auch Kopf- und Fußzeilenansichten berücksichtigt.

Parameter v Die Ansicht zum Hinzufügen.

Source

Sie können auch diese interesting post überprüfen.

Hoffe das hilft.

+0

wissen Sie, warum eine Klasse Guss Ausnahme auftreten könnte? –

+0

Ich habe meine Antwort mit diesem interessanten Beitrag aktualisiert http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablistview Ich denke, das wird Ihre Frage beantworten. –

+0

@CodeDroid Wenn Sie meine Antwort richtig gefunden haben, können Sie es bitte akzeptieren. Danke –

9

Dies ist ein Code für die Antwort oben, arbeitete sie in meinem Fall:

ich einen footerView gesetzt hatte (es ist ein loadingView in einem Listview mit Paginierung) meine Listview, bevor es Adapter setzen und es dann entfernen . Zuerst initialisiert ich meine 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); 
    } 
} 
+0

Das hat auch für mich funktioniert. Legen Sie eine Kopf-/Fußzeile fest, initiieren Sie den Adapter und entfernen Sie die Kopf-/Fußzeile. – wblaschko

+0

Aufruf von SetAdapter nach dem Hinzufügen einer Kopf-/Fußzeile ist der Grund, warum dieser Fix funktioniert –

+0

Können Sie auch eine 'listView.getAdapter()! = Null 'vor dem Hinzufügen der Fußzeile tun? – ono

1

Das Problem kommt nicht von removeFooterView(), aber von addFooterView(). Wenn Sie die Dokumentation lesen, heißt es, dass ein Wrapper zu Ihrem Adapter hinzugefügt werden:

Wenn die Adapterlistview nicht HeaderViewListAdapter nicht verlängert, wird es mit einer Stütz Instanz WrapperListAdapter gewickelt werden.

Sie müssen also den Getter zum Abrufen des verpackten Adapters verwenden und ihn auf Ihren Adapter übertragen.Gefällt mir:

((MyAdapter) ((HeaderViewListAdapter) listView.getAdapter()).getWrappedAdapter()) 

Hoffe, das wird Ihnen mit Ihrem Problem helfen.

Mit freundlichen Grüßen,

0

zu den anderen Antworten Hinzufügen, wenn Sie das Hinzufügen/Entfernen Fußzeilen dynamisch (wie wenn sie den Boden der Liste erreichen und dann sind Sie eine Fußzeile Ansicht Hinzufügen), um die einfachste Sache außer Kraft setzt setAdapter in Ihrem ListView an und fügen Sie ein neues View-Objekt als die Fußzeile gibt, dies stellt sicher, der Adapter in den HeaderViewListAdapter gewickelt ist:

@Override 
public void setAdapter(ListAdapter adapter) { 
    addFooterView(new View(getContext())); 
    super.setAdapter(adapter); 
} 
Verwandte Themen