从 RecyclerView 列表中删除某些为空的项目?

Posted

技术标签:

【中文标题】从 RecyclerView 列表中删除某些为空的项目?【英文标题】:Remove certain items which are empty from RecyclerView list? 【发布时间】: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);

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

除了我的回答之外,here 是一些从集合中删除项目的示例代码。 感谢您抽出宝贵时间提供帮助,我会尝试您的建议,这确实很有意义。 您的建议奏效了,谢谢!

以上是关于从 RecyclerView 列表中删除某些为空的项目?的主要内容,如果未能解决你的问题,请参考以下文章

带有 RecyclerView 的自定义 AlertDialog - 列表始终为空

Excel - 如何删除数据集中单元格B为空的所有行[重复]

从recyclerview中删除项目(viewholder具有onClick但适配器具有数据集)

在 PostgreSQL 中删除名称为空的表

我正在尝试将 firebase 实时数据库中的数据检索到我的 recyclerview 中,但数据显示为空

如何将数据从 RecyclerView 传递到 Kotlin 中的 DialogFragment?