Eamon M
Eamon M

Reputation: 83

DAO return type not compatible with List<Object>

I have created a Constructor to add a set of strings to a ROOM database on Android. The addition to the database is fine. When I pull from the database I get problems.

@Query("SELECT * FROM Movie") public List<Movie> getAllMovies();

My return type is a List of type Movies. My adapter for my recyclerViews requires a list of type List.

I cant seem to do anything with the List returned with all Cast etc giving me an error Error:: ie.dbs.sqlite.Movie cannot be cast to java.util.List

How can i convert the returned list into something usable? If i could create a new List from my List I think i would be set

enter image description here

public class ModuleAdapter extends RecyclerView.Adapter<ModuleAdapter.ViewHolder> {
    private List<Movie> movies;
   //private List<Object> movies;
    public static final String EXTRA_NUMBER = "ie.dbs.sqlite.EXTRA_NUMBER";
    private OnItemClickListener mListener;
    public interface OnItemClickListener{
        void onItemClick(int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;}

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView movie_id;
        public TextView movie_name;
        public TextView movie_desc;
        public TextView year_released;
        public TextView year_added;
        public TextView rating;
        public TextView year_updated;
        public View layout;
        public ImageView movie_cover;
        public ViewHolder(View v, final OnItemClickListener listener) {
        //public ViewHolder(View v) {
            super(v);
            layout = v;
            movie_id = (TextView) v.findViewById(R.id.movie_id);
            movie_name = (TextView) v.findViewById(R.id.movie_name);
            movie_desc = (TextView) v.findViewById(R.id.movie_desc);
            year_released = (TextView) v.findViewById(R.id.year_released);
            year_added = (TextView) v.findViewById(R.id.year_added);
            year_updated = (TextView) v.findViewById(R.id.year_updated);
            rating = (TextView) v.findViewById(R.id.rating);
            movie_cover = (ImageView) v.findViewById(R.id.movie_cover);


            v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if(listener != null){
                        int number = Integer.parseInt(movie_id.getText().toString());
                        int position = getAdapterPosition();
                        Intent intent = new Intent(view.getContext(), DetailsRecyclerActivity.class);
                        //intent.putExtra(Intent.EXTRA_TEXT,data.get(getAdapterPosition()));
                        intent.putExtra(EXTRA_NUMBER,number);
                        view.getContext().startActivity(intent);
                        if(position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);
                        }
                    }

                }
            });
        }
    }

    @Override
    public ModuleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View moduleView = inflater.inflate(R.layout.module, parent, false);
        ViewHolder module = new ViewHolder(moduleView, mListener);

        return module;
    }

    public ModuleAdapter(List<Movie> dataset) {
        movies = dataset;
    }
    /*public ModuleAdapter(List<Object> dataset) {
        movies = dataset;
    }*/

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        //final Map movie = (HashMap) movies.get(position);
        final Map movie = (Map) movies.get(position);


        holder.movie_id.setText(movie.get("Movie_ID").toString());
        //holder.movie_name.setText( R.string.Title);
        holder.movie_name.setText( movie.get("Movie_Name").toString());
        holder.movie_desc.setText(movie.get("Movie_Description").toString());
        holder.year_released.setText("Release date: " + movie.get("Year_Released").toString());
        holder.year_added.setText("Date Added:" + movie.get("DateAdded").toString());
        holder.rating.setText("Rating: " + movie.get("Rating").toString());
        holder.year_updated.setText("Updated: " + movie.get("DateUpdated").toString());
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        try {

        URL url = new URL(RecyclerActivity.applicationContext.getResources().getString(R.string.api_url)
                +movie.get("Movie_Cover").toString());
        Bitmap thumb = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        //holder.avatar.setImageBitmap(avatar);
        holder.movie_cover.setImageBitmap(thumb);//avatar in this case is the Bitmap variable name
    } catch (Exception e) {
        e.printStackTrace();
    }
}

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

}

Upvotes: 0

Views: 590

Answers (1)

hemen
hemen

Reputation: 1490

here's the issue,

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    //final Map movie = (HashMap) movies.get(position);
    final Map movie = (Map) movies.get(position);
     // your list gives you Movie instances, and you are casting it to Map?
     // should it be Movie movie = movies.get(position)?
}

Upvotes: 2

Related Questions