ClassCastException beim Aufrufen von ListView.addHeaderView()?

Lesezeit: 7 Minuten

Benutzer-Avatar
Howettl

Ich habe ein ziemlich komplexes Layout (mit RelativeLayouts, TextViews und ImageViews), das ich über einer Listview platzieren möchte. Diese Ansicht sollte mit der Listenansicht scrollen.

Ich habe versucht, das Layout mit diesem Code als Kopfzeile zur Listenansicht hinzuzufügen:

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 ist ein benutzerdefinierter Adapter, den ich geschrieben habe und der sich erstreckt BaseAdapter.

Beim Ausführen des Codes erhalte ich diesen Fehler:

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)

Wenn ich die auskommentiere mList.addHeaderView(header) Zeile bekomme ich den Fehler nicht. Ich kann das Header-Layout auch ohne die Listview problemlos anzeigen.

Ich gehe davon aus, dass dies etwas mit dem Inhalt des Header-Layouts zu tun hat, aber ich bin mir nicht sicher, was es genau verursachen würde.

Hier ist die 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="https://stackoverflow.com/questions/8275669/@drawable/icon_rating_empty" />

                    <ImageView
                        android:id="@+id/overall_2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="https://stackoverflow.com/questions/8275669/@drawable/icon_rating_empty" />

                    <ImageView
                        android:id="@+id/overall_3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="https://stackoverflow.com/questions/8275669/@drawable/icon_rating_empty" />

                    <ImageView
                        android:id="@+id/overall_4"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="https://stackoverflow.com/questions/8275669/@drawable/icon_rating_empty" />

                    <ImageView
                        android:id="@+id/overall_5"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="https://stackoverflow.com/questions/8275669/@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>

Aktualisieren: Ich habe versucht, die Header-.xml-Datei auf nur eine einzige TextView zu reduzieren, und das Problem besteht weiterhin. Ich glaube also nicht, dass das Problem durch etwas in der XML-Datei verursacht wird.

  • Sollte das nicht mList.addHeaderView(header) sein oder gibt es irgendwo eine tatsächliche ‘h’-Ansicht?

    – Gehe zu 10

    26. November 2011 um 1:45 Uhr

  • Danke, dass du das aufgefangen hast, es ist passiert, während ich den Code kopiert habe. Der Beitrag wurde aktualisiert, um genauer zu sein.

    – howettl

    26. November 2011 um 3:07 Uhr

Benutzer-Avatar
iCantSeeSharp

FrameLayout und AbsListView Konvertieren Sie ihre untergeordneten Layoutparameter in FrameLayout.LayoutParams und AbsListView.LayoutParams. Hier scheitert das Casting.

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

sollte es beheben.

Bearbeiten: Wie in den Kommentaren erwähnt, funktioniert das Ändern des ViewGroup-Parameters des Inflate-Aufrufs auch:

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

  • Ok … aber ich verwende keine FrameLayouts. Deshalb bin ich verwirrt. Was versucht es zu werfen?

    – howettl

    28. November 2011 um 17:46 Uhr

  • Kannst du es versuchen View header = View.inflate(this, R.layout.header_layout.null); ?

    – iCantSeeSharp

    28. November 2011 um 18:27 Uhr

  • Ach, und außerdem: mList = (ListView) findViewById(R.id.list); ?

    – iCantSeeSharp

    28. November 2011 um 18:28 Uhr

  • Wechseln zu View header = View.inflate(this, R.layout.header_layout, null); Ich habe es gelöst! Können Sie mir erklären, was passiert ist? Bearbeiten Sie auch Ihre Antwort damit, damit ich sie akzeptieren kann.

    – howettl

    28. November 2011 um 18:41 Uhr

  • Dies geschieht in der Methode onCreateView() eines Fragments. Also die inflater und container stammen aus den Methodenparametern. Es stellt sich heraus, dass einfach das Original geändert wird inflater.inflate(...) Anruf zu verwenden null für die ViewGroup Parameter löst auch das Problem.

    – howettl

    28. November 2011 um 18:58 Uhr


Benutzer-Avatar
Cassie

Obwohl die Methode von Souvlaki das Problem behebt und Ihnen ermöglicht, weiter zu arbeiten. Es ist immer am besten, der aufzublasenden Ansicht einen Verweis auf den Container zu geben, in dem sie sich befinden wird. Dadurch kann Android sie für den richtigen Kontext korrekt aufblasen.

Was Sie tun sollten, ist die zu finden ListView und das dann zum Aufblasen weitergeben.

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

  • Es gibt keine Methode View.inflate was 4 Argumente braucht.

    – Jigar

    16. Dezember 2013 um 22:04 Uhr

  • Ausgezeichneter Punkt. Tut mir leid, ich hätte die Aufblasvorrichtung benutzen sollen, um den Anruf nicht zu tätigen View

    – Cassie

    9. Januar 2014 um 0:09 Uhr

  • Um vollständiger zu sein: ListView lv = (ListView) v.findViewById(android.R.id.list); View header = (View) inflater.inflate(R.layout.header_layout, lv, false);

    – GregM

    15. Juli 2014 um 16:01 Uhr


Ich sehe die gleiche Situation. In meinem Fall ist es ein Problem, dass das Timing für ListView.addHeaderView() aufgerufen wird.

Vorher: (Fehler)

ListView.addHeaderView() wird in der Methode Fragment.onCreateView() aufgerufen.

@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);
}

Nach OK)

ListView.addHeaderView() wird in der Methode Fragment.onActivityCreated() aufgerufen.

@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);
}

  • Dies ist die einzige Lösung, die für mich funktioniert hat. Verwenden onActivityCreated.

    – Ayman Salah

    2. September 2016 um 1:35 Uhr

Benutzer-Avatar
Gen Bo

Aus dem obigen Beitrag von drspaceboo hat dies für mich funktioniert:

@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);

Wobei getLayoutId() das Hauptlayout zurückgibt, das die ListView-XML enthält

1146150cookie-checkClassCastException beim Aufrufen von ListView.addHeaderView()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy