Android:在向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)) ,但我不明白为什么。 有任何想法吗?

好吧,我想出了这一个。 我摆脱了运行时错误,编程方式将视图的LayoutParams设置为ListView LayoutParams,如下所示:

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

在添加视图之前。 原因是在Android文档中find:

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

其中规定:

这些参数提供给这个视图的父级 ,指定应该如何安排。 ViewGroup.LayoutParams有许多子类,它们对应ViewGroup的不同子类,负责安排他们的孩子。

所以基本上,如果你正在向另一个视图添加视图,你必须将视图的LayoutParams设置为父级使用的LayoutParamstypes,否则你会得到一个运行时错误。

尽pipe上面的答案可能适用于很多人,但还是有更好的解释。 ClassCastException是调用listview.addHeaderViewlistview.addFooterView之后的正常行为。

原因是最初的适配器被包装在HeaderViewListAdapter 。 为了让你的适配器使用这个代码。

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

代码取自这里

在我的情况下,这是行不通的。 在设置它的适配器之前,我必须设置一个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); } } 

你应该把父视图放到你虚浮的视图中。

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