【发布时间】: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