java.lang.ClassCastException:GridLayout.LayoutParams无法强制转换为Frame.LayoutParams

java.lang.ClassCastException:GridLayout.LayoutParams无法强制转换为Frame.LayoutParams,java,android,xml,android-layout,android-studio,Java,Android,Xml,Android Layout,Android Studio,带Android Studio 2.0的OS X Yosemite 10.10.5 出于教学目的,我想将尽可能多的视图属性从XML移到Java 我有一个android.support.v7.widget.RecyclerView在GridLayout中,我想移动RecyclerView的android:layout\u gravity 从GridLayout.setGravity和R.attr文档中,我知道子级使用layout\u gravity在父级中设置重力属性 以下代码是异常的根本原因:

带Android Studio 2.0的OS X Yosemite 10.10.5

出于教学目的,我想将尽可能多的
视图
属性从XML移到Java

我有一个
android.support.v7.widget.RecyclerView
GridLayout
中,我想移动RecyclerView的
android:layout\u gravity

GridLayout.setGravity
R.attr
文档中,我知道子级使用
layout\u gravity
在父级中设置重力属性

以下代码是异常的根本原因:

GridLayout.LayoutParams parentParams = new GridLayout.LayoutParams();
parentParams.setGravity(Gravity.CENTER_VERTICAL);
container.setLayoutParams(parentParams);
我要收缩的XML:

<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/alphabet_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <!--android:layout_gravity="center_vertical">-->
    </android.support.v7.widget.RecyclerView>

</GridLayout>
我查找了android.view.view.measure(view.java:17430)以找到以下内容:

if (cacheIndex < 0 || sIgnoreMeasureCache) {
    // measure ourselves, this should set the measured dimension flag back
    onMeasure(widthMeasureSpec, heightMeasureSpec);
    mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
} else {
if(cacheIndex<0 | | sIgnoreMeasureCache){
//测量我们自己,这应该将测量的维度标志设置回原位
测量(宽度测量、高度测量);
mPrivateFlags3&=~PFLAG3在布局前需要测量;
}否则{
我真的不明白它是如何调用android.support.v7.widget.ContentFrameLayout.onMeasure而不是android.view.view.onMeasure的


我缺少什么?

在您提供的代码片段中:

GridLayout.LayoutParams parentParams = new GridLayout.LayoutParams();
parentParams.setGravity(Gravity.CENTER_VERTICAL);
container.setLayoutParams(parentParams);
从变量名
container
中可以看出,您试图将所构造的
LayoutParams
应用于
GridLayout
实例,而不是应用于
RecyclerView
实例。我希望最后一行看起来更像

recyclerView.setLayoutParams(parentParams);

如果我的假设是正确的,您的
GridLayout
的父级将最终尝试解析您构建的
LayoutParams
。此父级本身不太可能(!)是
GridLayout
(我从堆栈跟踪中猜测它是
FrameLayout
),并在尝试处理特定的
GridLayout
-specific
LayoutParams

显示那里的容器是什么请--container.setLayoutParams(parentParams);@dione llorera容器是一个GridLayout@MPG你说的是哪条导入语句?我正在将LayoutParams应用于GridLayout,因为layout\u gravity将应用于子级的父级。但是,RecyclerView.LayoutParams不包含任何与gravity相关的方法。虽然父级应解析这些布局参数,但yOU还必须将它们应用到该子(当请求时将该信息传递给父类)。考虑在代码中试图复制的XML;在LayoutParams上设置“<代码> LayOutTrave属性”,而不是在父级上。尝试将< <代码> < <代码> >应用到<代码> CurryReVIEW < /代码>(即“子”)。在我建议的代码中-它应该按照您的预期工作。RecyclerView.LayoutParams不包含任何与重力相关的方法。您的意思是我必须将parentParams从GridLayout.LayoutParams强制转换为RecyclerView.LayoutParams。即使您将它们应用于
实例,您仍然应该使用
GridLayout$LayoutParams
实例>RecyclerView
。您使用的
LayoutParams
类型应该与父视图组的类型相匹配,而不是与应用它们的子视图的类型相匹配。这是一个奇怪的API,这是肯定的:)不仅奇怪,而且没有正确的文档记录。无论如何,您的解决方案工作正常。
recyclerView.setLayoutParams(parentParams);