44 votes

Android: ClassCastException lors de l'ajout d'un en-tête de la vue à ExpandableListView

J'essaye d'ajouter un en-tête à un ExpandableListView comme suit:

headerView = View.inflate(this, R.layout.header, null);
expandableListView.addHeaderView(headerView);
expandableListView.setAdapter(new SectionedAdapter(this));

Ce qui me donne l'erreur suivante:

 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)

Ce qui se passe à l'appel d' expandableListView.setAdapter(new SectionedAdapter(this)), mais je ne peux pas comprendre pourquoi. Des idées?

91voto

Christopher Perry Points 7972

Ok, j'ai compris ça. Je me suis débarrassé de l'erreur d'exécution en programmant paramétrage de l'Affichage du LayoutParams à la liste LayoutParams, comme suit:

headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));

avant l'ajout de la vue. La raison en est trouvé dans google docs:

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

qui stipule que:

Ces paramètres d'approvisionnement de la parent de ce point de vue en précisant comment elle doit être organisée. Il y a beaucoup de les sous-classes de ViewGroup.LayoutParams, et ceux-ci correspondent aux différents les sous-classes de ViewGroup qui sont responsable de l'organisation de leur les enfants.

Donc, fondamentalement, si vous êtes l'ajout d'une vue à l'autre, vous DEVEZ définir la LayoutParams de la vue à la LayoutParams type que le parent utilise, ou vous obtiendrez une erreur d'exécution.

1voto

wzbozon Points 2851

Dans mon cas, cela n'a pas fonctionné. J'ai dû mettre un footerView à ma liste avant le réglage de l'adaptateur. D'abord j'ai initialisé mon loadingView à partir d'un fichier de mise en page dans la méthode OnCreate:

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);

Ensuite, j'ai utilisé cette solution de contournement dans la même méthode:

this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);

private void setIsLoading(boolean isLoading)
{
    this.isLoading = isLoading;

    if (isLoading) {
        listView.addFooterView(loadingView);
    }
    else {
        listView.removeFooterView(loadingView);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X