Тип возврата DAO не совместим с List <Object> - PullRequest
0 голосов
/ 29 апреля 2020

Я создал конструктор для добавления набора строк в базу данных ROOM на Android. Добавление в базу данных в порядке. При извлечении из базы данных у меня возникают проблемы.

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

Мой тип возвращаемого значения - список типов фильмов. Моему адаптеру для моих recyclerViews требуется список типа List.

Кажется, я ничего не могу сделать со списком, возвращенным со всеми Cast et c, сообщая мне ошибку Error:: ie.dbs.sqlite.Movie cannot be cast to java.util.List

Как можно я преобразовал возвращенный список во что-то пригодное для использования? Если бы я мог создать новый список из моего списка, я думаю, что я был бы установлен

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

}

1 Ответ

2 голосов
/ 29 апреля 2020

вот в чем проблема,

@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)?
}
...