recyclerview强制转换异常?

时间:2018-10-31 19:39:47

标签: android android-recyclerview android-viewholder

我正在使用RecyclerView OnBindViewHolder方法开发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;

            }
        }


    }
}

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

在调试模式下的屏幕截图:

screenshot in debugmode

1 个答案:

答案 0 :(得分:0)

错误可能在以下几行中:

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