android - recyclerview 强制转换异常?
问题描述
我正在使用RecyclerView OnBindViewHolder
方法开发 cv android。
我不能activity.drawer.navigation.com.kitabsawticlone.EducationAdapter$UniversityViewHolder
投到activity.drawer.navigation.com.kitabsawticlone.EducationAdapter.EducationViewHolder
在我的适配器类下面:
public class EducationAdapter extends RecyclerView.Adapter {
public Context context;
public List<Education> educationList;
private EducationItem educationItem;
public static class EducationViewHolder extends RecyclerView.ViewHolder {
public TextView duration, institution, degree;
public EducationViewHolder(View view) {
super(view);
duration = (TextView) itemView.findViewById(R.id.duration);
institution = (TextView) itemView.findViewById(R.id.institution);
degree = (TextView) itemView.findViewById(R.id.degree);
}
}
public static class SubjectViewHolder extends RecyclerView.ViewHolder {
public ImageView subjectImage;
public TextView subjects;
public SubjectViewHolder(@NonNull View itemView) {
super(itemView);
subjectImage = (ImageView) itemView.findViewById(R.id.subjectImage);
subjects = (TextView) itemView.findViewById(R.id.subjects);
}
}
public static class UniversityViewHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView item;
public UniversityViewHolder(@NonNull View itemView) {
super(itemView);
icon = (ImageView) itemView.findViewById(R.id.icon);
item = (TextView) itemView.findViewById(R.id.item);
}
}
public EducationAdapter(List<Education> educationList, EducationItem educationItem, Context context) {
this.educationList = educationList;
this.context = context;
this.educationItem = educationItem;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView;
switch (viewType) {
case INTERNET_TYPE:
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.education_item, parent, false);
return new EducationViewHolder(itemView);
case SUBJECT_TYPE:
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.subject, parent, false);
return new SubjectViewHolder(itemView);
case UNIVERSITY_TYPE:
itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.subject_list, parent, false);
return new UniversityViewHolder(itemView);
}
return null;
}
@Override
public int getItemViewType(int position) {
return educationList.get(position).type;
}
@Override
public int getItemCount() {
return educationList.size();
}
@TargetApi(Build.VERSION_CODES.M)
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
Education education = educationList.get(position);
if (education != null) {
switch (education.type()) {
case Education.INTERNET_TYPE:
((EducationViewHolder) holder).duration.setText(education.getDuration());
((EducationViewHolder) holder).degree.setText(education.getDegree());
((EducationViewHolder) holder).institution.setText(education.getInstitution());
break;
case Education.SUBJECT_TYPE:
((SubjectViewHolder) holder).subjects.getContext().getString(R.string.university_subject);
((SubjectViewHolder) holder).subjectImage.getContext().getDrawable(R.drawable.university_subjects);
break;
case Education.UNIVERSITY_TYPE:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
(( UniversityViewHolder) holder).icon.setImageResource(education.image);
}
((UniversityViewHolder) holder).item.setText(education.words);
break;
}
}
}
}
我检查了所有方法,它似乎工作正常。
调试模式截图:
解决方案
错误可能在以下几行中:
case Education.INTERNET_TYPE:
((EducationViewHolder) holder).duration.setText(education.getDuration());
((EducationViewHolder) holder).degree.setText(education.getDegree());
((EducationViewHolder) holder).institution.setText(education.getInstitution());
break;
在这里,您将类型转换holder
为EducationViewHolder
.
如果实际类型holder
是,UniversityViewHolder
则转换无法成功。
编辑:您的列表中的项目以及它们对您所代表的内容一定有问题。
在这一行之后:
Education education = educationList.get(position);
您获得education.type()
并在switch
您尝试进行类型转换的块中EducationViewHolder
,UniversityViewHolder
但这失败了!
由于您已经定义了getItemViewType()
使用此方法并使用以下代码重试:
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
switch (holder.getItemViewType(position)) {
case Education.INTERNET_TYPE:
((EducationViewHolder) holder).duration.setText(education.getDuration());
((EducationViewHolder) holder).degree.setText(education.getDegree());
((EducationViewHolder) holder).institution.setText(education.getInstitution());
break;
case Education.SUBJECT_TYPE:
((SubjectViewHolder) holder).subjects.getContext().getString(R.string.university_subject);
((SubjectViewHolder) holder).subjectImage.getContext().getDrawable(R.drawable.university_subjects);
break;
case Education.UNIVERSITY_TYPE:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
((UniversityViewHolder) holder).icon.setImageResource(education.image);
}
((UniversityViewHolder) holder).item.setText(education.words);
break;
}
}
推荐阅读
- xml - 如何在 xsl:comment 中包含 xml 并保持缩进
- html - 如何在 node-red 中使用纯 json 创建网页
- python - Scipy Curve_fit:为什么我的拟合这么差,如何改进?
- gstreamer - Gstreamer filesink 适用于命令行但不适用于 Java 代码
- github - GitHub:是否可以查看特定分支而不是整个仓库?
- node.js - Loopback 3 / Where Filter / LIKE / MSSQL 连接器错误
- sql - 如何修复提供用户输入的 PL/SQL 函数,它将通过条件语句并输出正确的行
- mediawiki - 在 MediaWiki API 中访问 Youtube 视频 URL 或 ID
- c++ - 如何制作类型定义函数的函数指针数组
- static-methods - 是否可以使用对象调用静态方法?