执行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 } }