GSepetadelis
GSepetadelis

Reputation: 300

java.lang.ClassCastException: ViewHolderItem cannot be cast to AnotherViewHolderItem

I'm trying to filter posts types (for example only images, audio, videos.....) and change the adapter to update items inside recycler view. But for some reason the first time i make any changes to my filter dialog the feature works without problems, but if i try to make any changes for 2nd time inside my dialog, i'm getting an java.lang.ClassCastException.

Error:

java.lang.ClassCastException: com.george.socialmeme.ViewHolders.ImageItemViewHolder cannot be cast to com.george.socialmeme.ViewHolders.VideoItemViewHolder

Method that displays the filter dialog:

void showFiltersDialog() {

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.posts_filter_bottom_sheet);

    View imagesItem = dialog.findViewById(R.id.view23);
    View videosItem = dialog.findViewById(R.id.view21);
    View soundsItem = dialog.findViewById(R.id.view22);
    View textItem = dialog.findViewById(R.id.view20);
    Button applyFiltersBtn = dialog.findViewById(R.id.apply_filters);

    if (!imagesItemSelected[0]) {
        dialog.findViewById(R.id.imageView30).setVisibility(View.GONE);
    }

    if (!videosItemSelected[0]) {
        dialog.findViewById(R.id.imageView32).setVisibility(View.GONE);
    }

    if (!soundsItemSelected[0]) {
        dialog.findViewById(R.id.imageView34).setVisibility(View.GONE);
    }

    if (!textItemSelected[0]) {
        dialog.findViewById(R.id.imageView36).setVisibility(View.GONE);
    }

    imagesItem.setOnClickListener(view -> {
        if (imagesItemSelected[0]) {
            imagesItemSelected[0] = false;
            dialog.findViewById(R.id.imageView30).setVisibility(View.GONE);
        } else {
            imagesItemSelected[0] = true;
            dialog.findViewById(R.id.imageView30).setVisibility(View.VISIBLE);
        }
    });

    videosItem.setOnClickListener(view -> {
        if (videosItemSelected[0]) {
            videosItemSelected[0] = false;
            dialog.findViewById(R.id.imageView32).setVisibility(View.GONE);
        } else {
            videosItemSelected[0] = true;
            dialog.findViewById(R.id.imageView32).setVisibility(View.VISIBLE);
        }
    });

    soundsItem.setOnClickListener(view -> {
        if (soundsItemSelected[0]) {
            soundsItemSelected[0] = false;
            dialog.findViewById(R.id.imageView34).setVisibility(View.GONE);
        } else {
            soundsItemSelected[0] = true;
            dialog.findViewById(R.id.imageView34).setVisibility(View.VISIBLE);
        }
    });

    textItem.setOnClickListener(view -> {
        if (textItemSelected[0]) {
            textItemSelected[0] = false;
            dialog.findViewById(R.id.imageView36).setVisibility(View.GONE);
        } else {
            textItemSelected[0] = true;
            dialog.findViewById(R.id.imageView36).setVisibility(View.VISIBLE);
        }
    });

    applyFiltersBtn.setOnClickListener(view -> {

        filteredPostsArrayList.clear();
        applyFiltersBtn.setText("Filtering...");
        applyFiltersBtn.setEnabled(false);
        dialog.setCancelable(false);

        for (PostModel postModel : postModelArrayList) {

                if (postModel.getPostType().equals("image")) {
                    if (imagesItemSelected[0]) {
                        filteredPostsArrayList.add(postModel);
                    }
                }

                if (postModel.getPostType().equals("video")) {
                    if (videosItemSelected[0]) {
                        filteredPostsArrayList.add(postModel);
                    }
                }

                if (postModel.getPostType().equals("audio")) {
                    if (soundsItemSelected[0]) {
                        filteredPostsArrayList.add(postModel);
                    }
                }

                if (postModel.getPostType().equals("text")) {
                    if (textItemSelected[0]) {
                        filteredPostsArrayList.add(postModel);
                    }
                }

        }

        // Update RecyclerView adapter
        recyclerAdapter = new PostRecyclerAdapter(filteredPostsArrayList, getContext(), getActivity());
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setStackFromEnd(true);
        layoutManager.setReverseLayout(true);
        recyclerView.setAdapter(recyclerAdapter);
        recyclerView.setLayoutManager(layoutManager);

        // Add post's of the month view as RecyclerView item
        // to avoid using ScrollView
        PostModel postsOfTheMonthView = new PostModel();
        postsOfTheMonthView.setPostType("postsOfTheMonth");
        filteredPostsArrayList.add(postsOfTheMonthView);

        recyclerAdapter.notifyDataSetChanged();

        dialog.dismiss();

    });

    dialog.show();
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    dialog.getWindow().setGravity(android.view.Gravity.BOTTOM);

}

My PostRecyclerAdapter class:

public class PostRecyclerAdapter extends RecyclerView.Adapter {

    List<PostModel> postList;
    Context context;
    Activity activity;

    @Override
    public int getItemViewType(int position) {

        if (postList.get(position).getPostType().equals("video")) {
            return 1;
        }

        if (postList.get(position).getPostType().equals("postsOfTheMonth")) {
            return 2;
        }

        if (postList.get(position).getPostType().equals("audio")) {
            return 3;
        }

        if (postList.get(position).getPostType().equals("text")) {
            return 4;
        }

        return 0;
    }

    public PostRecyclerAdapter(ArrayList<PostModel> postModelArrayList, Context context, Activity activity) {
        this.postList = postModelArrayList;
        this.context = context;
        this.activity = activity;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == 1) {
            return new VideoItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.video_post_item, parent, false));
        }
        if (viewType == 2) {
            return new PostsOfTheMonthItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.posts_of_the_month_view_item, parent, false));
        }
        if (viewType == 3) {
            return new AudioItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.audio_post_item, parent, false));
        }
        if (viewType == 4) {
            return new PostTextItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.text_post_item, parent, false));
        }
        return new ImageItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.image_post_item, parent, false));
    }

    // Release ExoPlayer when a video item is recycled
    // to avoid player errors on other video items inside RecyclerView
    @Override
    public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
        super.onViewRecycled(holder);
        if (postList.get(holder.getLayoutPosition()).getPostType().equals("video")) {
            VideoItemViewHolder videoViewHolder = (VideoItemViewHolder) holder;
            videoViewHolder.andExoPlayerView.getPlayer().release();
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") int position) {

        DatabaseReference likeRef = FirebaseDatabase.getInstance().getReference("likes");
        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();

        if (postList.get(position).getPostType().equals("postsOfTheMonth")) {
            PostsOfTheMonthItemViewHolder viewHolder = (PostsOfTheMonthItemViewHolder) holder;
            viewHolder.setContext(context);
        }

        if (postList.get(position).getPostType().equals("text")) {

            // Bind audio view holder
            PostTextItemViewHolder textItemViewHolder = (PostTextItemViewHolder) holder;
            textItemViewHolder.setContext(context);

            if (HomeActivity.singedInAnonymously) {
                textItemViewHolder.commentsCount.setVisibility(View.GONE);
                textItemViewHolder.postOptionsButton.setVisibility(View.GONE);
                textItemViewHolder.openCommentsView.setVisibility(View.GONE);
                textItemViewHolder.shareBtn.setVisibility(View.GONE);
            }else {
                if (user.getUid().equals(postList.get(position).getAuthorID())) {
                    textItemViewHolder.followBtnView.setVisibility(View.GONE);
                }
            }

            // check if post is liked or not
            likeRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                    if (!HomeActivity.singedInAnonymously) {

                        // check if current post is liked from this user
                        if (snapshot.child(textItemViewHolder.postID).hasChild(user.getUid())) {
                            // post is liked form this user
                            textItemViewHolder.like_btn.setImageResource(R.drawable.ic_like_filled);
                            textItemViewHolder.isPostLiked = true;
                        } else {
                            // post is not liked from this user
                            textItemViewHolder.like_btn.setImageResource(R.drawable.ic_like);
                            textItemViewHolder.isPostLiked = false;
                        }
                    } else {
                        textItemViewHolder.like_btn.setEnabled(false);
                    }

                }

                @Override
                public void onCancelled(@NonNull @NotNull DatabaseError error) {
                    Toast.makeText(context, "Error: " + error, Toast.LENGTH_SHORT).show();
                }
            });

            textItemViewHolder.postID = postList.get(position).getId();
            textItemViewHolder.username.setText(postList.get(position).getName());
            textItemViewHolder.postAuthorID = postList.get(position).getAuthorID();
            textItemViewHolder.like_counter_tv.setText(postList.get(position).getLikes());
            textItemViewHolder.commentsCount.setText(postList.get(position).getCommentsCount());

            // Load Title and content for the post
            textItemViewHolder.postTitle.setText(postList.get(position).getPostTitle());
            textItemViewHolder.postContentText.setText(postList.get(position).getPostContentText());

            // Load profile picture
            String profilePictureUrl = postList.get(position).getProfileImgUrl();
            if (profilePictureUrl != null) {
                if (!profilePictureUrl.equals("none")) {
                    Glide.with(context).load(profilePictureUrl).into(textItemViewHolder.profilePicture);
                }
            }

            textItemViewHolder.shareBtn.setOnClickListener(view -> {
                ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("post_url", postList.get(position).getImgUrl());
                clipboard.setPrimaryClip(clip);
                Toast.makeText(context, "Audio URL copied to clipboard", Toast.LENGTH_SHORT).show();
            });

        }

        if (postList.get(position).getPostType().equals("audio")) {

            // Bind audio view holder
            AudioItemViewHolder audioViewHolder = (AudioItemViewHolder) holder;
            audioViewHolder.setContext(context);

            if (HomeActivity.singedInAnonymously) {
                audioViewHolder.commentsCounter.setVisibility(View.GONE);
                audioViewHolder.postOptionsBtn.setVisibility(View.GONE);
                audioViewHolder.openCommentsView.setVisibility(View.GONE);
                audioViewHolder.shareBtn.setVisibility(View.GONE);
            }else {
                if (user.getUid().equals(postList.get(position).getAuthorID())) {
                    audioViewHolder.followBtnView.setVisibility(View.GONE);
                }
            }

            // check if post is liked or not
            likeRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                    if (!HomeActivity.singedInAnonymously) {

                        // check if current post is liked from this user
                        if (snapshot.child(audioViewHolder.postID).hasChild(user.getUid())) {
                            // post is liked form this user
                            audioViewHolder.likeBtn.setImageResource(R.drawable.ic_like_filled);
                            audioViewHolder.isPostLiked = true;
                        } else {
                            // post is not liked from this user
                            audioViewHolder.likeBtn.setImageResource(R.drawable.ic_like);
                            audioViewHolder.isPostLiked = false;
                        }
                    } else {
                        // disable like button
                        audioViewHolder.likeBtn.setEnabled(false);
                    }

                }

                @Override
                public void onCancelled(@NonNull @NotNull DatabaseError error) {
                    Toast.makeText(context, "Error: " + error, Toast.LENGTH_SHORT).show();
                }
            });

            audioViewHolder.postID = postList.get(position).getId();
            audioViewHolder.usernameTV.setText(postList.get(position).getName());
            audioViewHolder.postAuthorID = postList.get(position).getAuthorID();
            audioViewHolder.likesCounter.setText(postList.get(position).getLikes());
            audioViewHolder.audioURL = postList.get(position).getImgUrl();
            audioViewHolder.audioName.setText(postList.get(position).getAudioName());
            audioViewHolder.commentsCounter.setText(postList.get(position).getCommentsCount());

            // Load audio source
            audioViewHolder.audioPlayerView.withUrl(postList.get(position).getImgUrl());

            // Load profile picture
            String profilePictureUrl = postList.get(position).getProfileImgUrl();
            if (profilePictureUrl != null) {
                if (!profilePictureUrl.equals("none")) {
                    Glide.with(context).load(profilePictureUrl).into(audioViewHolder.profilePicture);
                }
            }

            audioViewHolder.shareBtn.setOnClickListener(view -> {
                ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("post_url", postList.get(position).getImgUrl());
                clipboard.setPrimaryClip(clip);
                Toast.makeText(context, "Audio URL copied to clipboard", Toast.LENGTH_SHORT).show();
            });

        }

        if (postList.get(position).getPostType().equals("video")) {

            // bind video view holder
            VideoItemViewHolder videoViewHolder = (VideoItemViewHolder) holder;
            videoViewHolder.setContext(context);

            if (HomeActivity.singedInAnonymously) {
                videoViewHolder.commentsCount.setVisibility(View.GONE);
                videoViewHolder.postOptionsButton.setVisibility(View.GONE);
                videoViewHolder.commentsBtn.setVisibility(View.GONE);
                videoViewHolder.shareBtn.setVisibility(View.GONE);
            }else {
                if (user.getUid().equals(postList.get(position).getAuthorID())) {
                    videoViewHolder.followBtnView.setVisibility(View.GONE);
                }
            }

            // check if post is liked or not
            likeRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                    if (!HomeActivity.singedInAnonymously) {

                        // check if current post is liked from this user
                        if (snapshot.child(videoViewHolder.postID).hasChild(user.getUid())) {
                            // post is liked form this user
                            videoViewHolder.like_btn.setImageResource(R.drawable.ic_like_filled);
                            videoViewHolder.isPostLiked = true;
                        } else {
                            // post is not liked from this user
                            videoViewHolder.isPostLiked = false;
                            videoViewHolder.like_btn.setImageResource(R.drawable.ic_like);
                        }
                    } else {
                        // disable like button
                        videoViewHolder.like_btn.setEnabled(false);
                    }

                }

                @Override
                public void onCancelled(@NonNull @NotNull DatabaseError error) {
                    Toast.makeText(context, "error: " + error, Toast.LENGTH_SHORT).show();
                }
            });

            videoViewHolder.postID = postList.get(position).getId();
            videoViewHolder.username.setText(postList.get(position).getName());
            videoViewHolder.postAuthorID = postList.get(position).getAuthorID();
            videoViewHolder.like_counter_tv.setText(postList.get(position).getLikes());
            videoViewHolder.videoURL = postList.get(position).getImgUrl();
            videoViewHolder.commentsCount.setText(postList.get(position).getCommentsCount());

            // Load video source
            ExoPlayer player = new ExoPlayer.Builder(context).build();
            MediaItem mediaItem = MediaItem.fromUri(postList.get(position).getImgUrl());
            player.setMediaItem(mediaItem);
            player.prepare();
            videoViewHolder.andExoPlayerView.setPlayer(player);

            player.addAnalyticsListener(new AnalyticsListener() {
                @Override
                public void onPlayerError(@NonNull EventTime eventTime, @NonNull PlaybackException error) {
                    //Toast.makeText(context, "" + error.getMessage(), Toast.LENGTH_SHORT).show();
                    Log.i("EXOPLAYER_ERROR", "" + error.getMessage());
                }
            });

            // Load profile picture
            String profilePictureUrl = postList.get(position).getProfileImgUrl();
            if (profilePictureUrl != null) {
                if (!profilePictureUrl.equals("none")) {
                    Glide.with(context).load(profilePictureUrl).into(videoViewHolder.profilePicture);
                }
            }

            videoViewHolder.shareBtn.setOnClickListener(view -> {
                ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("post_url", postList.get(position).getImgUrl());
                clipboard.setPrimaryClip(clip);
                Toast.makeText(context, "Video URL copied to clipboard", Toast.LENGTH_SHORT).show();
            });

        }

        if (postList.get(position).getPostType().equals("image")) {

            // bind image view holder
            ImageItemViewHolder imageViewHolder = (ImageItemViewHolder) holder;
            imageViewHolder.setContext(context);

            if (HomeActivity.singedInAnonymously) {
                imageViewHolder.commentsCount.setVisibility(View.GONE);
                imageViewHolder.show_comments_btn.setVisibility(View.GONE);
                imageViewHolder.showPostOptionsButton.setVisibility(View.GONE);
                imageViewHolder.shareBtn.setVisibility(View.GONE);
            }else {
                if (user.getUid().equals(postList.get(position).getAuthorID())) {
                    imageViewHolder.followBtnView.setVisibility(View.GONE);
                }
            }

            // check if post is liked or not from the user
            likeRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                    if (!HomeActivity.singedInAnonymously) {

                        // check if current post is liked from this user
                        if (snapshot.child(imageViewHolder.postID).hasChild(user.getUid())) {
                            // post is liked form this user
                            imageViewHolder.like_btn.setImageResource(R.drawable.ic_like_filled);
                            imageViewHolder.isPostLiked = true;
                        } else {
                            // post is not liked from this user
                            imageViewHolder.isPostLiked = false;
                            imageViewHolder.like_btn.setImageResource(R.drawable.ic_like);
                        }
                    } else {
                        imageViewHolder.like_btn.setEnabled(false);
                    }

                }

                @Override
                public void onCancelled(@NonNull @NotNull DatabaseError error) {
                    Toast.makeText(context, "error: " + error, Toast.LENGTH_SHORT).show();
                }
            });

            imageViewHolder.postID = postList.get(position).getId();
            imageViewHolder.username.setText(postList.get(position).getName());
            imageViewHolder.postAuthorID = postList.get(position).getAuthorID();
            imageViewHolder.like_counter_tv.setText(postList.get(position).getLikes());
            imageViewHolder.commentsCount.setText(postList.get(position).getCommentsCount());

            Picasso.get().load(postList.get(position).getImgUrl()).into(imageViewHolder.postImg, new Callback() {
                @Override
                public void onSuccess() {
                    imageViewHolder.loadingProgressBar.setVisibility(View.GONE);
                }

                @Override
                public void onError(Exception e) {
                    Toast.makeText(context, "Can't load this image: " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                }
            });
            imageViewHolder.postImageURL = postList.get(position).getImgUrl();

            // Load profile picture
            String profilePictureUrl = postList.get(position).getProfileImgUrl();
            if (profilePictureUrl != null) {
                if (!profilePictureUrl.equals("none")) {
                    Glide.with(context).load(profilePictureUrl).into(imageViewHolder.profileImage);
                }
            }

            imageViewHolder.shareBtn.setOnClickListener(view -> {
                ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("post_url", postList.get(position).getImgUrl());
                clipboard.setPrimaryClip(clip);
                Toast.makeText(context, "Image URL copied to clipboard", Toast.LENGTH_SHORT).show();
            });

        }

    }


    @Override
    public int getItemCount() {
        return postList.size();
    }

}

Upvotes: 0

Views: 816

Answers (1)

Jan Rozenbajgier
Jan Rozenbajgier

Reputation: 634

It seems you're trying to cast item which is not an instance of VideoItemViewHolder to VideoItemViewHolder. Before making cast, check if the item is an instance of VideoItemViewHolder:

if(holder instanceof VideoItemViewHolder){
   VideoItemViewHolder videoViewHolder = (VideoItemViewHolder) holder;
   //Do your stuff...
} else {
   //Cast cannot be done
}

Upvotes: 1

Related Questions