RecyclerView 在 Android 中重新创建后未显示任何内容
RecyclerView not showing anything after being recreated, in Android
所以我有这个详细信息 Activity,我在底部有一个 RecyclerView
并加载 "Related Movies"。
adapter = new CustomRecycleAdapter(getRelatedMovies());
adapter.notifyDataSetChanged();
我正在使用 Retrofit API 加载数据。这是我的 getRelatedMovies()
函数:
ArrayList<RelatedMovies> items;
private ArrayList<RelatedMovies> getRelatedMovies() {
items = new ArrayList<>();
Plugin.api.GetPackageVideos(publisher_id, package_id, getIntent().getStringExtra("movieCategory"), 1 + "", "asc", new Callback<MovieResults>() {
@Override
public void success(MovieResults movieResults, Response response) {
Videos[] vids = movieResults.getResponse().getResult().getVideos();
for (int i = 0; i < vids.length; i++) {
items.add(new RelatedMovies(vids[i].getTitle(), vids[i].getCustom_attributes().getGenres_en().split(",")[0], vids[i].getCustom_attributes().getPromoImage()));
}
}
@Override
public void failure(RetrofitError error) {
Log.e("ERROR", error.toString());
}
});
return items;
}
问题来了:当我返回主屏幕搜索另一部电影,并输入带有该电影 ID 的详细信息 Activity 时,RecyclerView
没有显示任何内容,只有我第一次打开电影。这也是我的 RecyclerAdapter
的代码:
public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> {
ArrayList<RelatedMovies> relatedMovies;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvRelatedMovieTitle, tvRelatedMoviePrice;
public ImageView ivRelatedMoviePoster;
public CardView cv;
public ViewHolder(View itemView) {
super(itemView);
this.tvRelatedMovieTitle = (TextView) itemView.findViewById(R.id.tvRelatedMovieTitle);
this.tvRelatedMoviePrice = (TextView) itemView.findViewById(R.id.tvRelatedMoviePrice);
this.ivRelatedMoviePoster = (ImageView) itemView.findViewById(R.id.ivRelatedMoviePoster);
this.cv = (CardView) itemView.findViewById(R.id.cv);
}
}
public CustomRecycleAdapter(ArrayList<RelatedMovies> relatedMovies) {
this.relatedMovies = new ArrayList<RelatedMovies>();
this.relatedMovies = relatedMovies;
}
@Override
public CustomRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).
inflate(R.layout.recycle_view_cards, parent, false);
return new CustomRecycleAdapter.ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final CustomRecycleAdapter.ViewHolder holder, int position) {
RelatedMovies movie = relatedMovies.get(position);
holder.tvRelatedMovieTitle.setText(movie.movieTitle);
holder.tvRelatedMoviePrice.setText(movie.moviePrice);
Glide.with(holder.ivRelatedMoviePoster.getContext())
.load(movie.moviePosterUrl)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.fitCenter()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
holder.ivRelatedMoviePoster.setImageBitmap(resource);
}
});
}
@Override
public int getItemCount() {
return relatedMovies.size();
}
}
知道为什么会这样吗?
private void getRelatedMovies() {
Plugin.api.GetPackageVideos(publisher_id, package_id, getIntent().getStringExtra("movieCategory"), 1 + "", "asc", new Callback<MovieResults>() {
@Override
public void success(MovieResults movieResults, Response response) {
List<RelatedMovies> items = new ArrayList<>();
Videos[] vids = movieResults.getResponse().getResult().getVideos();
for (int i = 0; i < vids.length; i++) {
items.add(new RelatedMovies(vids[i].getTitle(), vids[i].getCustom_attributes().getGenres_en().split(",")[0], vids[i].getCustom_attributes().getPromoImage()));
}
adapter = new CustomRecycleAdapter(items);
recyclerView.setAdapter(adapter);
}
@Override
public void failure(RetrofitError error) {
Log.e("ERROR", error.toString());
}
});
}
或者您在现有适配器中交换列表并调用 notifyDataSetChanged() 或它具有的更新方法之一,例如 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyItemRangeInserted(int, int)
所以我有这个详细信息 Activity,我在底部有一个 RecyclerView
并加载 "Related Movies"。
adapter = new CustomRecycleAdapter(getRelatedMovies());
adapter.notifyDataSetChanged();
我正在使用 Retrofit API 加载数据。这是我的 getRelatedMovies()
函数:
ArrayList<RelatedMovies> items;
private ArrayList<RelatedMovies> getRelatedMovies() {
items = new ArrayList<>();
Plugin.api.GetPackageVideos(publisher_id, package_id, getIntent().getStringExtra("movieCategory"), 1 + "", "asc", new Callback<MovieResults>() {
@Override
public void success(MovieResults movieResults, Response response) {
Videos[] vids = movieResults.getResponse().getResult().getVideos();
for (int i = 0; i < vids.length; i++) {
items.add(new RelatedMovies(vids[i].getTitle(), vids[i].getCustom_attributes().getGenres_en().split(",")[0], vids[i].getCustom_attributes().getPromoImage()));
}
}
@Override
public void failure(RetrofitError error) {
Log.e("ERROR", error.toString());
}
});
return items;
}
问题来了:当我返回主屏幕搜索另一部电影,并输入带有该电影 ID 的详细信息 Activity 时,RecyclerView
没有显示任何内容,只有我第一次打开电影。这也是我的 RecyclerAdapter
的代码:
public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> {
ArrayList<RelatedMovies> relatedMovies;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvRelatedMovieTitle, tvRelatedMoviePrice;
public ImageView ivRelatedMoviePoster;
public CardView cv;
public ViewHolder(View itemView) {
super(itemView);
this.tvRelatedMovieTitle = (TextView) itemView.findViewById(R.id.tvRelatedMovieTitle);
this.tvRelatedMoviePrice = (TextView) itemView.findViewById(R.id.tvRelatedMoviePrice);
this.ivRelatedMoviePoster = (ImageView) itemView.findViewById(R.id.ivRelatedMoviePoster);
this.cv = (CardView) itemView.findViewById(R.id.cv);
}
}
public CustomRecycleAdapter(ArrayList<RelatedMovies> relatedMovies) {
this.relatedMovies = new ArrayList<RelatedMovies>();
this.relatedMovies = relatedMovies;
}
@Override
public CustomRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).
inflate(R.layout.recycle_view_cards, parent, false);
return new CustomRecycleAdapter.ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final CustomRecycleAdapter.ViewHolder holder, int position) {
RelatedMovies movie = relatedMovies.get(position);
holder.tvRelatedMovieTitle.setText(movie.movieTitle);
holder.tvRelatedMoviePrice.setText(movie.moviePrice);
Glide.with(holder.ivRelatedMoviePoster.getContext())
.load(movie.moviePosterUrl)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.fitCenter()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
holder.ivRelatedMoviePoster.setImageBitmap(resource);
}
});
}
@Override
public int getItemCount() {
return relatedMovies.size();
}
}
知道为什么会这样吗?
private void getRelatedMovies() {
Plugin.api.GetPackageVideos(publisher_id, package_id, getIntent().getStringExtra("movieCategory"), 1 + "", "asc", new Callback<MovieResults>() {
@Override
public void success(MovieResults movieResults, Response response) {
List<RelatedMovies> items = new ArrayList<>();
Videos[] vids = movieResults.getResponse().getResult().getVideos();
for (int i = 0; i < vids.length; i++) {
items.add(new RelatedMovies(vids[i].getTitle(), vids[i].getCustom_attributes().getGenres_en().split(",")[0], vids[i].getCustom_attributes().getPromoImage()));
}
adapter = new CustomRecycleAdapter(items);
recyclerView.setAdapter(adapter);
}
@Override
public void failure(RetrofitError error) {
Log.e("ERROR", error.toString());
}
});
}
或者您在现有适配器中交换列表并调用 notifyDataSetChanged() 或它具有的更新方法之一,例如 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyItemRangeInserted(int, int)