执行notifyDataSetChanged时使用ListView的ClassCastException

时间:2010-12-09 23:24:42

标签: listview header dataset adapter notify

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

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

在我尝试执行(数据更改时)

之前一切正常
adapter.notifyDataSetChanged();

这总是导致我的应用程序崩溃,导致我出现以下错误:

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

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

6 个答案:

答案 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
    }
}