从 RecyclerView 列表中删除某些为空的项目?
Remove certain items which are empty from RecyclerView list?
我正在使用 TMDB 制作应用程序 API,但遇到了一个小问题。
TMDB API 显示了空的季和剧集,基本上,那些还没有播出,但由于它们是空的,应用程序显示了一个我试图摆脱的空白项目。
这是我的适配器:
public class SeasonAdapter extends RecyclerView.Adapter<SeasonAdapter.ViewHolder> {
private final List<Season> seasons;
private final Context context;
private final RequestOptions requestOptions;
public SeasonAdapter(List<Season> seasons, Context context) {
this.seasons = seasons;
this.context = context;
requestOptions = new RequestOptions().centerCrop().placeholder(R.drawable.poster_placeholder).error(R.drawable.poster_placeholder);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_season_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Season season = seasons.get(position);
holder.tvTitle.setText(season.getSeasonTitle());
if (season.getSeasonDate() != null && !season.getSeasonDate().isEmpty()) {
holder.tvDate.setText(context.getResources().getString(R.string.aired_on) + season.getSeasonDate());
} else {
holder.tvDate.setVisibility(View.GONE);
}
if (season.getSeasonEpisodes() == 0) {
seasons.remove(position);
}
holder.tvEpisodes.setText(String.valueOf(season.getSeasonEpisodes()) + context.getResources().getString(R.string.total_episodes));
Glide.with(context).load(season.getSeasonImageURL()).apply(requestOptions).into(holder.ivPoster);
holder.itemView.setOnClickListener(v -> {
Intent intent = new Intent(context, EpisodeActivity.class);
intent.putExtra("title", season.getShowTitle());
intent.putExtra("seasonTitle", season.getSeasonTitle());
intent.putExtra("seasonNo", season.getSeasonNo());
intent.putExtra("tvId", season.getTvId());
v.getContext().startActivity(intent);
});
}
@Override
public int getItemCount() {
return seasons.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView ivPoster;
public TextView tvTitle, tvDate, tvEpisodes;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivPoster = itemView.findViewById(R.id.ivSeasonPoster);
tvTitle = itemView.findViewById(R.id.tvSeasonTitle);
tvDate = itemView.findViewById(R.id.tvSeasonAired);
tvEpisodes = itemView.findViewById(R.id.tvSeasonEpisodes);
//Poster Corners
ivPoster.setClipToOutline(true);
}
}
}
我试过这样做:
if (season.getSeasonEpisodes() == 0) {
seasons.remove(position);
}
它似乎确实隐藏了没有剧集的季节,但如果一个节目有多个没有剧集的季节,我的应用程序会崩溃,所以我认为这不是正确的解决方案,因此我们将不胜感激。
我建议在适配器的构造函数中而不是在 onBind
中执行删除逻辑。 onBind
发生在回收者视图在向用户显示之前立即完成每个视图持有者的详细信息时。你想在这里做尽可能少的逻辑来保持回收器视图的性能。
在构造函数内部(甚至在传入列表之前)您应该执行一个循环并在设置实例变量之前删除那些不符合条件的项目。
我已经有很长时间没有在 java 中编写代码了,所以如果我在这里尝试这样做,我最终会得到毫无帮助的错误语法。
我正在使用 TMDB 制作应用程序 API,但遇到了一个小问题。
TMDB API 显示了空的季和剧集,基本上,那些还没有播出,但由于它们是空的,应用程序显示了一个我试图摆脱的空白项目。
这是我的适配器:
public class SeasonAdapter extends RecyclerView.Adapter<SeasonAdapter.ViewHolder> {
private final List<Season> seasons;
private final Context context;
private final RequestOptions requestOptions;
public SeasonAdapter(List<Season> seasons, Context context) {
this.seasons = seasons;
this.context = context;
requestOptions = new RequestOptions().centerCrop().placeholder(R.drawable.poster_placeholder).error(R.drawable.poster_placeholder);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_season_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Season season = seasons.get(position);
holder.tvTitle.setText(season.getSeasonTitle());
if (season.getSeasonDate() != null && !season.getSeasonDate().isEmpty()) {
holder.tvDate.setText(context.getResources().getString(R.string.aired_on) + season.getSeasonDate());
} else {
holder.tvDate.setVisibility(View.GONE);
}
if (season.getSeasonEpisodes() == 0) {
seasons.remove(position);
}
holder.tvEpisodes.setText(String.valueOf(season.getSeasonEpisodes()) + context.getResources().getString(R.string.total_episodes));
Glide.with(context).load(season.getSeasonImageURL()).apply(requestOptions).into(holder.ivPoster);
holder.itemView.setOnClickListener(v -> {
Intent intent = new Intent(context, EpisodeActivity.class);
intent.putExtra("title", season.getShowTitle());
intent.putExtra("seasonTitle", season.getSeasonTitle());
intent.putExtra("seasonNo", season.getSeasonNo());
intent.putExtra("tvId", season.getTvId());
v.getContext().startActivity(intent);
});
}
@Override
public int getItemCount() {
return seasons.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView ivPoster;
public TextView tvTitle, tvDate, tvEpisodes;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivPoster = itemView.findViewById(R.id.ivSeasonPoster);
tvTitle = itemView.findViewById(R.id.tvSeasonTitle);
tvDate = itemView.findViewById(R.id.tvSeasonAired);
tvEpisodes = itemView.findViewById(R.id.tvSeasonEpisodes);
//Poster Corners
ivPoster.setClipToOutline(true);
}
}
}
我试过这样做:
if (season.getSeasonEpisodes() == 0) {
seasons.remove(position);
}
它似乎确实隐藏了没有剧集的季节,但如果一个节目有多个没有剧集的季节,我的应用程序会崩溃,所以我认为这不是正确的解决方案,因此我们将不胜感激。
我建议在适配器的构造函数中而不是在 onBind
中执行删除逻辑。 onBind
发生在回收者视图在向用户显示之前立即完成每个视图持有者的详细信息时。你想在这里做尽可能少的逻辑来保持回收器视图的性能。
在构造函数内部(甚至在传入列表之前)您应该执行一个循环并在设置实例变量之前删除那些不符合条件的项目。
我已经有很长时间没有在 java 中编写代码了,所以如果我在这里尝试这样做,我最终会得到毫无帮助的错误语法。