【问题标题】:DAO return type not compatible with List<Object>DAO 返回类型与 List<Object> 不兼容
【发布时间】:2020-08-13 08:32:44
【问题描述】:

我创建了一个构造函数来将一组字符串添加到 Android 上的 ROOM 数据库。 添加到数据库中很好。 当我从数据库中提取时,我遇到了问题。

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

我的返回类型是电影类型的列表。我的 recyclerViews 适配器需要 List 类型的列表。

我似乎无法对所有 Cast 等返回的列表执行任何操作,这给了我一个错误 Error:: ie.dbs.sqlite.Movie cannot be cast to java.util.List

如何将返回的列表转换为可用的列表? 如果我可以从我的列表中创建一个新列表,我想我会被设置

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

}

【问题讨论】:

  • 然后,在您的回收器适配器中使用 Movie 类型的列表,或者创建另一个列表并填充列表,使用从 DAO 检索到的值并将其传递给适配器。发布您的适配器代码
  • 添加了带有建议的适配器代码,但运行时仍然出现错误。 (进程:ie.dbs.sqlite,PID:16256 java.lang.ClassCastException:ie.dbs.sqlite.Movie 无法在 ie.dbs.sqlite.ModuleAdapter.onBindViewHolder(ModuleAdapter.java:103 ) 在 ie.dbs.sqlite.ModuleAdapter.onBindViewHolder(ModuleAdapter.java:28)) 我也尝试从 List 创建一个 List 但即使在那个阶段我也会遇到同样的错误?
  • 看起来不错,有什么问题?
  • 最终的电影地图不接受对象,应用程序因 java.lang.ClassCastException 而崩溃:ie.dbs.sqlite.Movie 无法转换为 java.util.Map
  • 你明白了吗?

标签: java android sqlite android-studio android-room


【解决方案1】:

问题来了,

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

【讨论】:

  • 是的,这似乎确实用我的字符串创建了一个对象。它带来了一个额外的问题,因为我失去了 .get() 选项,我似乎无法访问电影中的值。如果我知道如何访问这些字符串,我认为问题将得到解决!我在主要问题中添加了屏幕截图
  • @EamonM 解决了吗?什么是额外的问题?在 Movie 类中使用 getter 和 setter,这就是您访问它的方式。 holder.movi​​e_id.setText(movie.getTitle());
  • 完美!我没有使用 getter 和 setter。谢谢你的帮助!!!!!!
猜你喜欢
  • 2022-06-19
  • 2014-08-29
  • 2016-05-28
  • 2019-09-06
  • 2013-11-11
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多