【问题标题】:recyclerview cast exception?recyclerview 强制转换异常?
【发布时间】:2019-04-05 01:26:30
【问题描述】:

我正在使用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;

            }
        }


    }
}

我已经检查了所有方法似乎都可以正常工作。

调试模式截图:

【问题讨论】:

标签: android android-recyclerview android-viewholder


【解决方案1】:

错误可能在以下几行中:

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

【讨论】:

  • 那么在这种情况下你的建议是什么
  • 我建议您通过在case Education.INTERNET_TYPE: 处设置断点来检查是否是这种情况。
  • 我得到这个输出 无法将 'activity.drawer.navigation.com.kitabsawtclone.EducationAdapter$UniversityViewHolder' 转换为 'activity.drawer.navigation.com.kitabsawtclone.EducationAdapter.SubjectViewHolder' 我已经放了 break已经点了
  • 我已经添加了调试模式的截图,请检查一下
  • @SnowdinjonEdgarjon 您尝试添加编辑此答案的屏幕截图,这是不正确的,而是添加编辑您的问题的屏幕截图(问题中还有一个编辑链接)。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2015-09-09
  • 2015-12-13
相关资源
最近更新 更多