2010-11-17 13 views
5

Sto provando a gonfiare un FrameLayout in una GridView e sto ricevendo un'eccezione. Ecco il metodo GetView dall'adattatore (una sottoclasse di BaseAdapter):ClassCastException quando si gonfia un FrameLayout in una GridView

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO: Create compound view with image and name overlayed on top 
    FrameLayout personFrame; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     personFrame = (FrameLayout)inflater.inflate(R.layout.thumbnail, null); 
     //personFrame = (FrameLayout)View.inflate(mContext, R.layout.thumbnail, null); 
     personFrame.setLayoutParams(new GridView.LayoutParams(85,85)); 
    } else { 
     personFrame = (FrameLayout) convertView; 
    } 

.... e così via

Ecco il layout sto gonfiaggio:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="85px" 
android:layout_height="85px"> 
<ImageView 
    android:id="@+id/thumbnail_image" 
    android:layout_height="85px" 
    android:padding="2px" 
    android:layout_width="85px" 
    android:scaleType="centerCrop" /> 
<TextView 
    android:id="@+id/person_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="2dip" 
    android:layout_gravity="center_horizontal|bottom" 

    android:padding="2dip" 

    android:background="#AA000000" 
    android:textColor="#ffffffff" 

    android:text="Me" /> 
</FrameLayout> 

I' ve provato con e senza impostare le LayoutParams esplicitamente e ottengo la stessa eccezione di volta in volta, che è:

E/AndroidRuntime( 420): java.lang.ClassCastException:  android.widget.FrameLayout$LayoutParams 
E/AndroidRuntime( 420): at android.widget.GridView.onMeasure(GridView.java:934) 
E/AndroidRuntime( 420): at android.view.View.measure(View.java:8171) 
E/AndroidRuntime( 420): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
E/AndroidRuntime( 420): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
E/AndroidRuntime( 420): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
E/AndroidRuntime( 420): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
E/AndroidRuntime( 420): at android.view.View.measure(View.java:8171) 
E/AndroidRuntime( 420): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
E/AndroidRuntime( 420): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
E/AndroidRuntime( 420): at android.view.View.measure(View.java:8171) 
E/AndroidRuntime( 420): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
E/AndroidRuntime( 420): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
E/AndroidRuntime( 420): at android.view.View.measure(View.java:8171) 
E/AndroidRuntime( 420): at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
E/AndroidRuntime( 420): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
E/AndroidRuntime( 420): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 420): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 420): at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime( 420): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 420): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 420): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime( 420): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime( 420): at dalvik.system.NativeStart.main(Native Method) 

Qualcuno può indicare dove sono andato male qui? Molte grazie

risposta

-4

GridView non è un FrameLayout, entrambi sono ViewGroup ma non è un FrameLayout.

+0

Se cambio GridView.LayoutParams su FrameLayout.LayoutParams, ottengo lo stesso stacktrace, quindi non sono sicuro di cosa intendi. –

+0

che ottieni un ClassCastException, come provare a lanciare un Banana su una Apple. Puoi lanciare Banana in frutta, ma non in una mela. Leggere in Android javadoc qual è l'ereditarietà di queste 2 classi e leggere nel web "L'ereditarietà di Java" per acquisire una conoscenza generale di questo argomento. – apps

+0

Capisco cosa sia un'eccezione di classe cast, sto chiedendo che cosa sta causando - lo stacktrace è interamente codice SDK quindi è piuttosto oscuro su come sono riuscito a romperlo. Ho cercato e cercato e non riesco a trovare alcuna spiegazione su come dovrei fare questo (usa FrameLayouts gonfiato in una GridView). –

0

Beh, non so cosa stava succedendo, ma la rimozione di setLayoutParams l'ha corretto. Non so come impostare questi parametri nel codice, ma non sembra necessario, quindi va bene. Ho anche fatto lo stupido errore di restituire l'oggetto sbagliato dal metodo getView, ma questo non ha influito su questo crash.

18

In realtà restituire l'oggetto errato da getView (come hai detto che stavi facendo) è ciò che ha causato l'eccezione. Ad esempio, se hai restituito un pulsante all'interno di FrameLayout anziché in FrameLayout, ciò causerà il problema che descrivi. Il codice GridView sta prendendo l'oggetto View restituito e camminando di un passo verso l'alto nella gerarchia View. Lì si aspetta di trovare AbsListView (che racchiude ogni elemento della vista griglia in). Poiché hai restituito un elemento secondario di FrameLayout, la classe GridView ha trovato un FrameLayout in cui si aspettava AbsListView.

+0

+1 Questa è la risposta giusta – onof

+0

Sì, questa è stata anche la risposta giusta per me, la risposta "accettata" non è nemmeno una risposta, non aiuta nessuno a risolvere questo problema –

9

Provare a cambiare:

personFrame.setLayoutParams(new GridView.LayoutParams(85,85)); 

a:

personFrame.setLayoutParams(new AbsListView.LayoutParams(85,85)); 

Sembra che quando si imposta LayoutParams di un oggetto, deve essere gettato-in grado di genitore del LayoutParams. Nel tuo caso, il genitore di personFrame è la visualizzazione a griglia.

Problemi correlati