2010-11-17 8 views
5

Estoy tratando de inflar un FrameLayout en un GridView y estoy recibiendo una excepción. Aquí está el método getView del adaptador (una subclase de BaseAdapter):ClassCastException al inflar un FrameLayout en un 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; 
    } 

.... y así sucesivamente

Aquí está el diseño que estoy inflando:

<?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' he intentado con y sin ajuste de los LayoutParams explícita y tengo la misma excepción cada vez, lo que es:

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) 

¿Puede alguien señalar dónde me he equivocado aquí? Muchas gracias

Respuesta

-4

GridView no es un FrameLayout, ambos son ViewGroups pero no es un FrameLayout.

+0

Si cambio GridView.LayoutParams a FrameLayout.LayoutParams obtengo la misma stacktrace, así que no estoy seguro de a qué se refiere. –

+0

que obtiene una ClassCastException, como intentar lanzar un plátano a una manzana. Puedes lanzar plátano a la fruta, pero no a una manzana. Lea en el javadoc de Android cuál es la herencia de estas 2 clases y lea en la web "herencia de Java" para obtener un conocimiento general de este tema. – apps

+0

Entiendo lo que es una excepción de lanzamiento de clases, estoy preguntando qué es lo que está causando: stacktrace es un código SDK completo, por lo que es bastante oscuro en cuanto a cómo logré romperlo. Busqué y busqué y no encuentro ninguna explicación sobre cómo debo hacer esto (use FrameLayouts inflado en un GridView). –

0

Bueno, no sé lo que estaba pasando, pero la eliminación de setLayoutParams lo solucionó. No sé cómo configurar esos parámetros en el código, pero no parece ser necesario, así que está bien. También cometí el error estúpido de devolver el objeto incorrecto del método getView, pero eso no estaba afectando a este bloqueo.

18

En realidad, devolver el objeto equivocado de getView (como mencionaste que estabas haciendo) es lo que causó la excepción. Por ejemplo, si devolvió un botón desde su FrameLayout en lugar del propio FrameLayout, esto causará el problema que describe. El código GridView toma el objeto View que devuelve y avanza un paso hacia arriba en la jerarquía de View. Allí espera encontrar AbsListView (que envuelve cada elemento de la vista de cuadrícula). Debido a que devolvió un subelemento de su FrameLayout, la clase GridView encontró un FrameLayout donde esperaba un AbsListView.

+0

+1 Esta es la respuesta correcta – onof

+0

Sí, esta fue también la respuesta correcta para mí, la respuesta "aceptada" ni siquiera es una respuesta, ayuda a nadie a resolver este problema –

9

Prueba a cambiar:

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

a:

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

Parece que cuando se establece LayoutParams de un objeto, que sea echado-capaz de la matriz de LayoutParams. En su caso, el elemento primario de personFrame es la vista de cuadrícula.

Cuestiones relacionadas