исключение кастинга? - PullRequest
0 голосов
/ 31 октября 2018

Я занимаюсь разработкой cv android, используя метод RecyclerView OnBindViewHolder.

Я не могу разыграть 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 голосов
/ 31 октября 2018

Возможно, что ошибка в следующих строках:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...