【问题标题】:Remove certain items which are empty from RecyclerView list?从 RecyclerView 列表中删除某些为空的项目?
【发布时间】:2021-12-08 14:51:14
【问题描述】:

我正在使用 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);
}

它似乎确实隐藏了没有剧集的季节,但如果一个节目有多个没有剧集的季节,我的应用程序崩溃,所以我认为这不是正确的解决方案,因此感谢任何帮助。

【问题讨论】:

    标签: java android android-recyclerview android-adapter


    【解决方案1】:

    我建议在适配器的构造函数中而不是在onBind 中执行删除逻辑。 onBind 发生在回收器视图在显示给用户之前立即完成每个视图持有者的详细信息。您希望在此处执行尽可能少的逻辑以保持回收器视图的性能。

    在构造函数内部(甚至在传入列表之前),您应该执行一个循环并在设置实例变量之前删除那些不符合条件的项。

    自从我用 java 编写代码以来已经很久了,所以如果我在这里尝试这样做,我最终会遇到无用的错误语法。

    【讨论】:

    • 除了我的回答之外,here 是一些从集合中删除项目的示例代码。
    • 感谢您抽出宝贵时间提供帮助,我会尝试您的建议,这确实很有意义。
    • 您的建议奏效了,谢谢!
    猜你喜欢
    • 2020-03-25
    • 2013-05-28
    • 2016-06-24
    • 2019-05-12
    • 2018-05-28
    • 2018-05-23
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多