执行notifyDataSetChanged时带有ListView的ClassCastException

我已经添加了listVivew头的视图,

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

一切都很好,直到我尝试执行(当数据改变时)

 adapter.notifyDataSetChanged(); 

这总是使我的应用程序崩溃给我下面的错误:

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

如果我删除标题视图,那么没有错误。 有什么build议么? 谢谢。

看来,无论何时你在一个列表视图中使用页眉/页脚视图,你的ListView被包装一个HeaderViewListAdapter。 你可以使用下面的代码来解决这个问题:

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

API 18和更低的是关于什么是包装。 要帮助它,请将页眉和/或页脚设置为分配适配器。 这样正确的包装发生在封面之下。 然后立即删除页眉/页脚(如果这是你想要的)。

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

正如写在http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html应该这样做:;

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

@ mussharapp的答案是完全正确的,它的工作原理! 不过,我发现在setAdapter()之前,将适配器caching在成员variables上供以后使用会更方便:

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

类转换exception的原因是listview没有包装到headerlistview。 所以我们不能直接添加页脚到页眉。 因此,在将适配器设置为列表视图之前,请将哑视图添加为页眉或页脚视图。 然后将适配器设置为listview。 这使listview实例headerviewslist。 然后,你可以像往常一样轻松地从listview中添加和删除页脚。

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

设置适配器后,可以添加或删除页脚listview.addFooterView(yourFooter); 或者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 } }