【问题标题】:ClassCastException when inflating a FrameLayout in a GridView在 GridView 中膨胀 FrameLayout 时出现 ClassCastException
【发布时间】:2011-06-09 06:05:44
【问题描述】:

我正在尝试在 GridView 中为 FrameLayout 充气,但遇到了异常。这是来自适配器(BaseAdapter 的子类)的 getView 方法:

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

....等等

这是我正在膨胀的布局:

<?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>

我尝试过明确设置和不明确设置 LayoutParams,但每次都得到相同的异常,即:

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)

谁能指出我在这里出错的地方? 非常感谢

【问题讨论】:

    标签: android


    【解决方案1】:

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

    【讨论】:

    • 是的,这对我来说也是正确的答案,“接受”的答案甚至根本不是答案,它帮助没有人真正解决这个问题
    【解决方案2】:

    尝试改变:

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

    到:

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

    似乎当您设置对象的LayoutParams 时,它应该可以转换为父对象的LayoutParams。在您的情况下,personFrame 的父级是网格视图。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        GridView 不是 FrameLayout,两者都是 ViewGroups 但不是 FrameLayout。

        【讨论】:

        • 如果我将 GridView.LayoutParams 更改为 FrameLayout.LayoutParams 我会得到相同的堆栈跟踪,所以我不确定你的意思。
        • 你得到一个 ClassCastException,就像试图将香蕉投射到苹果一样。您可以将香蕉投射到水果上,但不能投射到苹果上。在 Android javadoc 中阅读这两个类的继承是什么,并在网络中阅读“Java 继承”以了解该主题的一般知识。
        • 我了解什么是类强制转换异常,我在问是什么导致了它 - 堆栈跟踪完全是 SDK 代码,所以我如何设法打破它非常模糊。我搜索和搜索,但找不到任何关于我应该如何执行此操作的解释(使用在 GridView 中膨胀的 FrameLayouts)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多