I try using Picasso to load a file from the internal memory by uri. All the time it crashes, it gives a java.lang.ClassCastException error: android.widget.LinearLayout please find a mistake

import android.net.Uri; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.List; import it.sephiroth.android.library.picasso.Picasso; public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final String LOG_TAG = "my_log"; List<Cover> covers; RecyclerAdapter(List<Cover> covers) { this.covers = covers; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView){ super.onAttachedToRecyclerView(recyclerView); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int i) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Cover cover = covers.get(position); String filePath = String.valueOf(cover.getFileBookCover()); Log.d(LOG_TAG, "Cover URI URI: " + filePath); Uri uri = cover.getFileBookCover(); Picasso .with(holder.itemView.getContext()) .load(uri) .into((ImageView) holder.itemView); } @Override public int getItemCount() { return covers.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { CardView cardView; ImageView imgObl; ViewHolder (View itemView) { super(itemView); cardView = itemView.findViewById(R.id.card_view); imgObl = itemView.findViewById(R.id.iv_recycler_item); } } } 

    1 answer 1

    .into((ImageView) holder.itemView); - a mistake here. need to write .into(holder.imgObl)

    You throw a picasso the root of the holder, the caller ID is not an ImageView

    And it’s better to make a bind() public method in the holder. Pass the uri and let Picasso call it in this method. and on the adapter in the onBindViewHolder method call holder.bind(uri)

     public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ImageViewHolder> { private static final String LOG_TAG = "my_log"; List<Cover> covers; RecyclerAdapter(List<Cover> covers) { this.covers = covers; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView){ super.onAttachedToRecyclerView(recyclerView); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int i) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ImageViewHolder holder, int position) { Cover cover = covers.get(position); String filePath = String.valueOf(cover.getFileBookCover()); Log.d(LOG_TAG, "Cover URI URI: " + filePath); Uri uri = cover.getFileBookCover(); holder.bind(uri); } @Override public int getItemCount() { return covers.size(); } public static class ImageViewHolder extends RecyclerView.ViewHolder { private CardView cardView; private ImageView imgObl; ViewHolder (View itemView) { super(itemView); cardView = itemView.findViewById(R.id.card_view); imgObl = itemView.findViewById(R.id.iv_recycler_item); } public void bind(Uri uri) { Picasso .with(itemView.getContext()) .load(uri) .into(imgObl); } } 

    }

    • paints red, does not allow to write so - Vyacheslav
    • Of course, it swears, you type in OnBindViewHolder, not with your ViewHolder class, but with the base one from the recycler. he has no imgObl fields. - Sviat Volkov
    • one
      extends RecyclerView.Adapter <ViewHolder> - do this. and in general, your classes should not be called the same as basic ones. confused. better name ImageViewHolder - Sviat Volkov
    • @ Vyacheslav supplemented the answer with the full code - Sviat Volkov
    • Everything works, thank you! - Vyacheslav