J'ai un champ edittext et un bouton "recherche". Lorsque je clique sur Rechercher, je dois afficher une liste avec les données correspondant aux valeurs saisies dans l'edittext. J'ai ajouté un en-tête à ma liste en utilisant addHeader (). Lorsque je recherche pour la première fois, je peux afficher les données dans la liste avec succès. Mais lorsque je cherche à nouveau, je reçois l'erreur ci-dessous.
FATAL EXCEPTION: main
Java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
at Android.widget.ListView.addHeaderView(ListView.Java:261)
at Android.widget.ListView.addHeaderView(ListView.Java:284)
J'ai attribué un en-tête à ma liste avant de configurer l'adaptateur.
Ci-dessous mon code:
myList = (ListView) findViewById(R.id.searchResultsList);
View header = View.inflate(this, R.layout.search_results_header, null);
myList.addHeaderView(header, null, false);
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.setAdapter(dataAdapter);
Où je me trompe?
Sur Android 2.3, ajouter un en-tête après setAdapter (même si vous avez ajouté tôt, puis supprimé) lève une exception. Pour masquer ou afficher un en-tête de manière dynamique, utilisez setVisibility (). Comment? Vous pouvez voir Masquer les vues d'en-tête .
Impossible d'ajouter une vue d'en-tête à la liste - setAdapter a déjà été appelé . Comme vous pouvez le voir, myList.addHeaderView (en-tête) doit être exécuté avant
J'ai eu le même problème aujourd'hui. J'ai plusieurs ListViews .. Avec les informations du premier, cela construit la liste du suivant et tout le monde y a setAdapter ..
setListAdapter(null);
au-dessus de la fonction, où je gonfle l'en-tête. J'espère que ça aide..
Essaye ça..
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
Si vous avez utilisé Android:entries
dans ListView dans un fichier xml, sa méthode est appelée setAdapter()
avant addHeaderView. Supprimez donc Android:entries
attribute de ListView dans le fichier de présentation XML. Ce sera un travail.
vous pouvez ajouter FrameLayout en tant qu'en-tête avant de configurer l'adaptateur et ajouter/supprimer dynamiquement une vue dans FrameLaypout
Après je mis
final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true);
avant
listView.setAdapter(adapter);
un problème est toujours apparu. Ensuite, j'ai créé Build> Clean Project.
L'exception est levée par Android api.Pour les niveaux d'API inférieurs à KitKat, la méthode addHeader () ou addFooter () doit être appelée avant la méthode setAdapter ().
Il est mentionné dans la documentation de l'API: