Android 在GridView中展开FrameLayout时的ClassCastException

Android 在GridView中展开FrameLayout时的ClassCastException,android,Android,我试图在GridView中膨胀框架布局,但遇到了一个异常。下面是来自适配器(BaseAdapter的子类)的getView方法: 。。。。等等 这是我正在膨胀的布局: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="85px" android:layout_hei

我试图在GridView中膨胀框架布局,但遇到了一个异常。下面是来自适配器(BaseAdapter的子类)的getView方法:

。。。。等等

这是我正在膨胀的布局:

<?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>
有人能指出我哪里出了问题吗?
非常感谢

GridView不是框架布局,两者都是视图组,但它不是框架布局。

我不知道发生了什么,但是删除setLayoutParams修复了它。我不知道如何在代码中设置这些参数,但它似乎不是必需的,所以这很好。我还犯了一个愚蠢的错误,从getView方法返回了错误的对象,但这并没有影响这次崩溃。

实际上从getView返回了错误的对象(正如您提到的那样)是导致异常的原因。例如,如果从FrameLayout中返回按钮,而不是从FrameLayout本身返回按钮,这将导致您描述的问题。GridView代码获取您返回的视图对象,并在视图层次结构中向上走一步。它希望在那里找到一个AbsListView(它将每个网格视图项包装在其中)。因为您返回了FrameLayout的子元素,GridView类找到了一个FrameLayout,它需要一个AbsListView。

尝试更改:

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


似乎在设置对象的
LayoutParams
时,应该能够将其强制转换为父对象的
LayoutParams
。在您的例子中,
personFrame
的父级是网格视图。

如果我将GridView.LayoutParams更改为FrameLayout.LayoutParams,我会得到相同的堆栈跟踪,因此我不确定您的意思。您会得到一个ClassCastException,就像试图向苹果扔香蕉一样。你可以把香蕉扔给水果,但不能扔给苹果。阅读Android javadoc这两个类的继承是什么,并在web上阅读“Java继承”以获得关于这个主题的一般知识。我了解什么是类强制转换异常,我问是什么导致了它-stacktrace完全是SDK代码,所以我如何设法打破它,这是相当模糊的。我搜索了又搜索,但我找不到任何关于我应该如何做的解释(在GridView中使用框架布局)。是的,这对我来说也是正确的答案,“接受的”答案甚至根本不是答案,它没有帮助任何人真正解决这个问题
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)
personFrame.setLayoutParams(new GridView.LayoutParams(85,85));
personFrame.setLayoutParams(new AbsListView.LayoutParams(85,85));