38

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

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

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

adapter.notifyDataSetChanged();

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

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

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

4

6 回答 6

125

似乎每当您在列表视图中使用页眉/页脚视图时,您的 ListView 都会被 HeaderViewListAdapter 包裹起来。您可以使用以下代码解决此问题:

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
于 2012-05-30T16:03:20.590 回答
12

API 18 及更低版本对其包装的内容感到困惑。为了帮助它,请在分配适配器之前设置您的页眉和/或页脚。这样,正确的包装就发生在封面下。然后立即删除页眉/页脚(如果这是你想要的)。

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
于 2014-08-11T03:57:28.000 回答
6

正如http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html中所写, 应该这样做:

HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
于 2016-04-01T14:46:40.577 回答
0

@mussharapp 的回答是完全正确的,而且有效!但是,我发现在执行 setAdapter() 之前将适配器简单地缓存在成员变量上以供以后使用会更方便:

mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
于 2014-12-13T15:40:45.303 回答
0

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

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

设置适配器后,您可以添加或删除页脚 listview.addFooterView(yourFooter); 或 listview.removeFooterView(yourFooter);

于 2017-08-16T22:55:50.630 回答
-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
    }
}
于 2012-04-17T10:56:44.727 回答