ClassCastException avec ListView lors de l’exécution de notifyDataSetChanged

J’ai ajouté une vue à l’en-tête de listVivew,

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

Et tout va bien jusqu’à ce que j’essaie d’exécuter (lorsque les données changent)

 adapter.notifyDataSetChanged(); 

Cela plante toujours mon application en me donnant l’erreur suivante:

> java.lang.ClassCastException: android.widget.HeaderViewListAdapter

Si je supprime la vue d’en-tête, il n’y a pas d’erreur. Aucune suggestion? Merci.

Il semble que chaque fois que vous utilisez des vues d’en-tête / pied de page dans une vue de liste, votre ListView est enveloppé d’un HeaderViewListAdapter. Vous pouvez résoudre ce problème en utilisant le code ci-dessous:

 ((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged(); 

API 18 et plus bas est confus quant à ce qu’il est en train d’emballer. Pour vous aider, définissez votre en-tête et / ou votre pied de page AVANT d’affecter l’adaptateur. De cette façon, le bon emballage se fait sous les couvertures. Supprimez ensuite l’en-tête / le pied de page immédiatement après (si c’est ce que vous voulez).

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

Comme écrit dans http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html, cela devrait être fait:

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

La réponse de @ mussharapp est parfaitement correcte et ça marche! Cependant, je trouve plus pratique de simplement mettre en cache votre adaptateur sur une variable membre pour une utilisation ultérieure avant de définir setAdapter ():

 mAdapter = new YourAdapter(ctx, items); listView.addFooterView(v); listView.setAdapter(mAdapter); 

La raison de l’exception de conversion de classe est que la vue de liste n’a pas été intégrée à headerlistview. Nous ne pouvons donc pas append directement des bas de page ou un en-tête à listview. Donc, avant de configurer l’adaptateur en vue liste, ajoutez une vue factice en vue d’en-tête ou de pied de page. Définissez ensuite l’adaptateur sur listview. Cela rend la listview à l’instance de headerviewslist. Ensuite, vous pouvez append et supprimer les pieds de page facilement de listview comme d’habitude.

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

Après avoir défini l’adaptateur, vous pouvez append ou supprimer le fichier listview.addFooterView du pied de page (yourFooter); ou listview.removeFooterView (yourFooter);

 public class YourOwnList extends ListActivity { private EfficientAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { mAdapter = new EfficientAdapter(/*your parameters for the adapter*/); } private void yourMethod () { mAdapter.notifyDataSetChanged(); } private static class EfficientAdapter extends CursorAdapter { // your adapter } }