首页 > 解决方案 > 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;

            }
        }


    }
}

我检查了所有方法,它似乎工作正常。

调试模式截图:

调试模式截图

标签: androidandroid-recyclerviewandroid-viewholder

解决方案


错误可能在以下几行中:

case Education.INTERNET_TYPE:
    ((EducationViewHolder) holder).duration.setText(education.getDuration());
    ((EducationViewHolder) holder).degree.setText(education.getDegree());
    ((EducationViewHolder) holder).institution.setText(education.getInstitution());
    break;

在这里,您将类型转换holderEducationViewHolder.
如果实际类型holder是,UniversityViewHolder则转换无法成功。
编辑:您的列表中的项目以及它们对您所代表的内容一定有问题。
在这一行之后:

Education education = educationList.get(position); 

您获得education.type()并在switch您尝试进行类型转换的块中EducationViewHolderUniversityViewHolder但这失败了!
由于您已经定义了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;
    }
}

推荐阅读