Android:向ExpandableListView添加标题视图时的ClassCastException

时间:2010-12-09 00:33:15

标签: android android-linearlayout expandablelistview classcastexception

我正在尝试向ExpandableListView添加标题,如下所示:

headerView = View.inflate(this, R.layout.header, null);
expandableListView.addHeaderView(headerView);
expandableListView.setAdapter(new SectionedAdapter(this));

这给了我以下错误:

 12-08 16:23:42.354:
 ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
 12-08 16:23:42.354:   ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504)
 12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490)
 12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422)
 12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)

这是在致电expandableListView.setAdapter(new SectionedAdapter(this))时发生的,但我无法弄清楚原因。有什么想法吗?

4 个答案:

答案 0 :(得分:91)

好的,我想出了这个。通过以编程方式将View的LayoutParams设置为ListView LayoutParams来解决运行时错误,如下所示:

headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));

添加视图之前。原因可以在Android文档中找到:

http://developer.android.com/reference/android/view/View.html#setLayoutParams(android.view.ViewGroup.LayoutParams)

指出:

  

这些供应参数   此视图的指定如何安排它。有许多   ViewGroup.LayoutParams的子类,   而这些对应的是不同的   ViewGroup的子类   负责安排他们的   孩子。

所以基本上,如果要将视图添加到另一个视图,则必须将视图的LayoutParams设置为父级使用的LayoutParams类型,否则会出现运行时错误。

答案 1 :(得分:4)

尽管上述答案可能适用于许多人,但仍有更好的解释。 调用ClassCastExceptionlistview.addHeaderView后,listview.addFooterView是正常行为。

原因是初始适配器包含在HeaderViewListAdapter中。 要让您的适配器使用此代码。

YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();

Code taken from here

答案 2 :(得分:1)

在我的情况下,这不起作用。在设置适配器之前,我必须将footerView设置为listView。首先,我在OnCreate方法的布局文件中初始化了我的loadingView:

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);

然后我在同一方法中使用了这种解决方法:

this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);

其中

private void setIsLoading(boolean isLoading)
{
    this.isLoading = isLoading;

    if (isLoading) {
        listView.addFooterView(loadingView);
    }
    else {
        listView.removeFooterView(loadingView);
    }
}

答案 3 :(得分:0)

您应该将父视图放在充气视图中。

ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);