调用ListView.addHeaderView()时发生ClassCastException?

我有一个相当复杂的布局(包含RelativeLayouts,TextViews和ImageViews),我想放在一个列表视图。 这个视图应该与列表视图一起滚动。

我尝试使用此代码添加布局作为标题到列表视图:

View v = inflater.inflate(R.layout.list_view, container, false); View header = inflater.inflate(R.layout.header_layout, container, false); // populate views in the header mList = (ListView)v.findViewById(R.id.list); mList.addHeaderView(header); mAdapter = new ReviewsAdapter(getActivity()); mList.setAdapter(mAdapter); <-- error occurs here 

ReviewsAdapter是我写的扩展BaseAdapter的自定义适配器。

执行代码后,我得到这个错误:

 11-25 17:19:14.802: E/AndroidRuntime(1215): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.clearRecycledState(ListView.java:513) 11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.resetList(ListView.java:499) 11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.setAdapter(ListView.java:442) 11-25 17:19:14.802: E/AndroidRuntime(1215): at com.coppi.storefront.product.ProductReviewsFragment.onCreateView(ProductReviewsFragment.java:104) 

如果我注释掉mList.addHeaderView(header)行,我不会得到错误。 我也可以在没有列表视图的情况下显示标题布局。

我假设这与头部布局的内容有关,但我不确定究竟是什么原因造成的。

这是标题xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/header_section" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/margin_sides" android:background="@color/pdp_availability_section_background" > <TextView android:id="@+id/header_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_sides" android:paddingBottom="@dimen/margin_sides" android:text="@string/ratings_reviews" android:textColor="#000" android:textSize="18dp" /> </RelativeLayout> <RelativeLayout android:id="@+id/body_section" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/header_section" > <TextView android:id="@+id/product_title" style="@style/ProductTitleFont" android:layout_marginBottom="@dimen/product_title_bottom_margin" android:layout_marginLeft="@dimen/margin_sides" android:layout_marginRight="@dimen/margin_sides" /> <RelativeLayout android:id="@+id/attributes_section" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/product_title" android:layout_centerHorizontal="true" android:layout_margin="@dimen/margin_sides" > <LinearLayout android:id="@+id/overall_section" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="bottom" > <TextView android:id="@+id/overall_label" style="@style/ProductTitleFont" android:layout_width="wrap_content" android:text="@string/overall_rating" /> <ImageView android:id="@+id/overall_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:src="@drawable/icon_rating_empty" /> <ImageView android:id="@+id/overall_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_rating_empty" /> <ImageView android:id="@+id/overall_3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_rating_empty" /> <ImageView android:id="@+id/overall_4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_rating_empty" /> <ImageView android:id="@+id/overall_5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_rating_empty" /> <TextView android:id="@+id/overall_score" style="@style/ProductTitleFont" android:layout_width="wrap_content" android:layout_marginLeft="10dp" android:text="4.6" /> </LinearLayout> <Button android:id="@+id/rate_review_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/overall_section" android:layout_marginBottom="@dimen/margin_sides" android:layout_marginTop="@dimen/margin_sides" android:text="@string/rate_review_button_text" /> </RelativeLayout> <View android:id="@+id/attributes_divider" android:layout_width="fill_parent" android:layout_height="1dp" android:layout_below="@id/attributes_section" android:layout_marginBottom="@dimen/margin_sides" android:layout_marginTop="@dimen/margin_sides" android:background="@color/pdp_section_divider" /> <TextView android:id="@+id/review_count" style="@style/ProductTitleFont" android:layout_width="wrap_content" android:layout_below="@id/attributes_divider" android:layout_marginLeft="@dimen/margin_sides" android:text="0 " /> <TextView style="@style/ProductTitleFont" android:layout_width="wrap_content" android:layout_alignBaseline="@id/review_count" android:layout_marginRight="@dimen/margin_sides" android:layout_toRightOf="@id/review_count" android:text="@string/customer_reviews" /> <View android:id="@+id/review_count_divider" android:layout_width="fill_parent" android:layout_height="1dp" android:layout_below="@id/review_count" android:layout_marginBottom="@dimen/margin_sides" android:layout_marginTop="@dimen/margin_sides" android:background="@color/pdp_section_divider" /> </RelativeLayout> </RelativeLayout> 

更新:我试图减less头文件.xml文件只是一个单一的TextView,问题仍然存在。 所以我不相信这个问题是由XML中的东西造成的。

FrameLayoutAbsListView将他们的子布局参数转换为FrameLayout.LayoutParamsAbsListView.LayoutParams 。 这是铸造失败的地方。

 View header = View.inflate(this, R.layout.header_layout, null); 

应该修复它。

编辑:正如在评论中提到的,改变充气呼叫的ViewGroup参数也使其工作:

 header = inflater.inflate(R.layout.header_layout, null, false); 

虽然Souvlaki的方法将解决这个问题,并让你继续工作。 最好是给视图充气,以便引导容器。这可以让Android正确地为正确的上下文充气。

你应该做的是findListView ,然后传递给inflate。

 ListView listView = (ListView) layout.findViewById(R.id.listview); View header = inflater.inflate(this, R.layout.header_layout, listView, false); 

从drspaceboo的post上面 ,这对我工作:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mListLayoutView = inflater.inflate(getLayoutId(), container, false); int headerLayoutId = R.layout.list_header_layout; mListHeaderView = inflater.inflate(headerLayoutId, mResourcesListView, false); // ... mResourcesListView.addHeaderView(mListHeaderView, null, false); 

getLayoutId()返回包含ListView xml的主布局

我看到同样的情况。 在我的情况下,这是ListView.addHeaderView()的调用计时的麻烦。

之前:(错误)
ListView.addHeaderView()在Fragment.onCreateView()方法中调用。

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_main, container, false); mListView = (ListView) layout.findViewById(R.id.listview); mListView.addHeaderView(inflater.inflate(R.layout.list_header_book, listview, false)); return layout; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new BookAdapter(getActivity(), mBookList); mListView.setOnItemClickListener(mBookItemClickListener); mListView.setAdapter(mAdapter); } 

后:(OK)
ListView.addHeaderView()在Fragment.onActivityCreated()方法中调用。

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_main, container, false); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new BookAdapter(getActivity(), mBookList); mListView = (ListView) getView().findViewById(R.id.listview); mListView.setOnItemClickListener(mBookItemClickListener); mListView.addHeaderView(LayoutInflater.from(getActivity()).inflate(R.layout.list_header_book, null)); mListView.setAdapter(mAdapter); }