java.lang.ClassCastException:GridLayout.LayoutParams无法强制转换为Frame.LayoutParams
带Android Studio 2.0的OS X Yosemite 10.10.5 出于教学目的,我想将尽可能多的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在父级中设置重力属性 以下代码是异常的根本原因:
视图
属性从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
-specificLayoutParams
显示那里的容器是什么请--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);