2010-12-09 59 views
36

J'ai ajouté en vue de l'en-tête de listVivew,ClassCastException avec ListView lors de l'exécution notifyDataSetChanged

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(); 

qui a toujours planter mon application en me donnant l'erreur suivante:

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

Si je supprime l'affichage d'en-tête, il n'y a pas d'erreur. Aucune suggestion? Merci.

+0

Vous devez utiliser 'ListView.LayoutParams'. Cochez cette case [1]. [1]: http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview/4401369#4401369 – Macarse

Répondre

-2
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 
    } 
} 
+2

Bienvenue sur StackOverflow. Il est toujours recommandé d'ajouter une ligne ou deux sur le code que vous publiez, cela aide les autres membres à mieux comprendre votre code – Vivek

123

Il semble que chaque fois que vous utilisez des vues d'en-tête/pied de page dans un listview, 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(); 
+2

Mon 'listView.getAdapter()' n'est pas une instance de 'HeaderViewListAdapter' après une vue de bas de page ajoutée. – ono

+0

Merci beaucoup. Je ne pouvais pas suivre l'approche ci-dessous en raison de la structure de mon application – rahulinaction

+0

@ono: ce serait FooterViewListAdapter je pense – divyenduz

12

API 18 et inférieure est confus au sujet de ce qu'elle enveloppe. Pour l'aider, définissez votre en-tête et/ou pied de page avant d'affecter l'adaptateur. De cette façon, l'emballage correct a lieu sous les couvertures. Ensuite, supprimez l'en-tête/pied de page immédiatement après (si c'est ce que vous voulez).

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

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

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

Le raison de l'exception de distribution de classe est que la liste n'a pas été enveloppée dans headerlistview. Nous ne pouvons donc pas ajouter de pied de page ou d'en-tête à listview directement. Donc, avant de configurer l'adaptateur en listview, ajoutez une vue fictive en tant que vue d'en-tête ou de pied de page. Ensuite, réglez l'adaptateur sur listview. Cela rend listview à l'instance de headerviewslist. Ensuite, vous pouvez facilement ajouter et supprimer des bas de page dans la liste.

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

Après adaptateur de réglage, vous pouvez ajouter ou supprimer le pied de page listview.addFooterView (yourFooter); ou listview.removeFooterView (votreFooter);

+0

Vous devriez ajouter quelques exemples de code –