执行notifyDataSetChanged时,ListView中的ClassCastException
我在ListViview的标题中添加了一个视图执行notifyDataSetChanged时,ListView中的ClassCastException,listview,header,dataset,adapter,notify,Listview,Header,Dataset,Adapter,Notify,我在ListViview的标题中添加了一个视图 View TopSearch = (View) View.inflate(this, R.layout.search, null); lv.addHeaderView(TopSearch, null, false); 在我尝试执行之前(当数据更改时),一切都很好 总是使我的应用程序崩溃,并导致以下错误: >java.lang.ClassCastException:android.widget.HeaderServiceWList
View TopSearch = (View) View.inflate(this, R.layout.search, null);
lv.addHeaderView(TopSearch, null, false);
在我尝试执行之前(当数据更改时),一切都很好
总是使我的应用程序崩溃,并导致以下错误:
>java.lang.ClassCastException:android.widget.HeaderServiceWListAdapter
如果删除标题视图,则不会出现错误。有什么建议吗?谢谢。似乎每当您在listview中使用页眉/页脚视图时,您的listview都会被HeadServiceWListAdapter包装起来。您可以使用以下代码修复此问题:
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
}
}
((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
API 18和更低版本对包装的内容感到困惑。为此,请在分配适配器之前设置页眉和/或页脚。这样,正确的包装就可以在盖子下面进行了。然后立即删除页眉/页脚(如果需要)
@穆沙拉普的答案是完全正确的,而且是有效的!但是,我发现在执行setAdapter()之前,只需将适配器缓存在成员变量上以供以后使用更方便: 如 应该这样做:
HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
类强制转换异常的原因是listview未包装到headerlistview。所以我们不能直接向listview添加页脚或页眉。所以,在将适配器设置为listview之前,将虚拟视图添加为页眉或页脚视图。然后将适配器设置为listview。这使listview成为HeaderViewList的实例。然后,您可以像往常一样从listview中轻松添加和删除页脚
listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter):
设置适配器后,可以添加或删除页脚
addFooterView(您的页脚);或listview.removeFooterView(您的页脚) 您需要使用
ListView.LayoutParams
。勾选[此问题][1]。[1] :欢迎来到StackOverflow。总是建议添加一两行关于您发布的代码的内容,这有助于其他成员更好地理解您的代码mylistView.getAdapter()添加页脚视图后,
不是HeadServiceWListAdapter
的实例。非常感谢。由于我的app@ono:这可能是FooterViewListAdapter,我想现在我得到的是android.widget.ExpandableListConnector无法转换为*不是这样,请参阅。
mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter):