首次开发RecyclerView项目遇崩溃:ClassCastException类型转换异常
解决RecyclerView适配器中的ClassCastException问题
嘿,这个错误我太熟了!你碰到的java.lang.ClassCastException: ConstraintLayout cannot be cast to CardView,本质就是在ViewHolder初始化时,把布局里的ConstraintLayout对象强制转成了CardView,大概率是这两个环节出了问题:
可能的出错点
- item布局的根标签不匹配:你跟着教程写的item布局,根标签其实是
<android.support.constraint.ConstraintLayout>,但你在ViewHolder里却默认把整个itemView当成了CardView来强转。 - ViewHolder里的查找逻辑错误:你可能在ViewHolder里用
findViewById找CardView时,不小心用了根布局(ConstraintLayout)的ID,导致把ConstraintLayout实例当成了CardView。
举个例子,你的ViewHolder代码可能是这样的(错误版):
public class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View itemView) { super(itemView); // 错误:把根布局(ConstraintLayout)强转成CardView CardView cardView = (CardView) itemView; // 或者错误:用了根布局的ID,而这个ID对应的是ConstraintLayout CardView cardView = (CardView) itemView.findViewById(R.id.item_root_layout); } }
对应的解决方案
方案1:如果你的item确实需要CardView作为根布局
打开你的item布局xml文件,把根标签改成CardView,注意对应你的依赖库版本:
- 如果你用的是旧的Support库:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/item_card_view"> <!-- 内部的ConstraintLayout和其他控件 --> </android.support.v7.widget.CardView>
- 如果是AndroidX(现在AS默认推荐):
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/item_card_view"> <!-- 内部的ConstraintLayout和其他控件 --> </androidx.cardview.widget.CardView>
同时确保你的build.gradle里有对应的依赖:
- Support库:
implementation 'com.android.support:cardview-v7:28.0.0' - AndroidX:
implementation 'androidx.cardview:cardview:1.0.0'(可以用最新版本)
方案2:如果根布局就是ConstraintLayout,不需要改成CardView
那就在ViewHolder里修正强转的对象,或者正确找到布局内的CardView:
public class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View itemView) { super(itemView); // 如果根布局是ConstraintLayout,就转成ConstraintLayout ConstraintLayout rootLayout = (ConstraintLayout) itemView; // 如果布局里有嵌套的CardView,用它的正确ID查找 CardView cardView = (CardView) itemView.findViewById(R.id.inner_card_view); } }
另外提一句:现在新版本的Android Studio默认用AndroidX,如果你跟着的是比较老的YouTube教程,可能会出现Support库和AndroidX不兼容的情况,最好统一换成AndroidX的依赖和控件标签,避免更多奇怪的错误。
内容的提问来源于stack exchange,提问作者Daniel Morena
相关产品推荐
相关产品推荐

