执行notifyDataSetChanged时,ListView中的ClassCastException

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

我在ListViview的标题中添加了一个视图

    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。总是建议添加一两行关于您发布的代码的内容,这有助于其他成员更好地理解您的代码my
listView.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):