我在listVivew的标题中添加了一个视图,
View TopSearch = (View) View.inflate(this, R.layout.search, null);
lv.addHeaderView(TopSearch, null, false);
在我尝试执行(数据更改时)
之前一切正常adapter.notifyDataSetChanged();
这总是导致我的应用程序崩溃,导致我出现以下错误:
> java.lang.ClassCastException:android.widget.HeaderViewListAdapter
如果我删除标题视图,则没有错误。有什么建议?感谢。
答案 0 :(得分:124)
似乎无论何时在列表视图中使用页眉/页脚视图,ListView都会被HeaderViewListAdapter包装。您可以使用以下代码解决此问题:
((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
答案 1 :(得分:12)
API 18及更低版本对它的包装感到困惑。为了帮助它,请在分配适配器之前设置页眉和/或页脚。这样,正确的包裹发生在封面下。然后立即删除页眉/页脚(如果这是您想要的)。
myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
答案 2 :(得分:5)
正如http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html所述 它应该这样做:
HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
答案 3 :(得分:0)
@ mussharapp的答案是完全正确的,它的确有效!但是我发现在执行setAdapter()之前简单地将适配器缓存到成员变量以供以后使用更方便:
mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
答案 4 :(得分:0)
类强制转换异常的原因是listview没有包装到headerlistview。因此我们无法直接向listview添加页脚或标题。因此,在将适配器设置为listview之前,请将虚拟视图添加为页眉或页脚视图。然后将适配器设置为listview。这使listview成为headerviewslist的实例。然后,您可以正常地从列表视图中轻松添加和删除页脚。
listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter):
设置适配器后,您可以添加或删除页脚 listview.addFooterView(yourFooter);或listview.removeFooterView(yourFooter);
答案 5 :(得分:-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
}
}