如何在RecyclerView中按条件过滤仅显示未完成的工作任务卡片
解决方法
你当前代码的问题是仅在onBindViewHolder中跳过了已完成任务的内容赋值,但RecyclerView依然会为所有原始列表的条目创建空的item布局,同时getItemCount返回的是原始列表的总长度,所以会出现空占位或者所有条目都显示的问题。
具体修改步骤
1. 适配器新增过滤后数据源成员变量
在你的MyAdapter类中新增一个专门存储未完成任务的列表:
// 原有成员变量保留 Context context; ArrayList<JobModel> userArrayList; // 新增过滤后的未完成任务列表 private ArrayList<JobModel> unfinishedJobs;
2. 构造方法中初始化过滤逻辑
修改构造方法,初始化时就过滤出未完成的任务:
public MyAdapter(Context context, ArrayList<JobModel> userArrayList) { this.context = context; this.userArrayList = userArrayList; // 执行过滤逻辑 filterUnfinishedJobs(); } // 新增私有过滤方法 private void filterUnfinishedJobs() { unfinishedJobs = new ArrayList<>(); for (JobModel job : userArrayList) { if (!job.isJob_finished()) { unfinishedJobs.add(job); } } }
3. 修改列表长度返回值
把getItemCount的返回值改为过滤后的未完成任务列表长度:
@Override public int getItemCount() { return unfinishedJobs.size(); }
4. 简化onBindViewHolder逻辑
现在unfinishedJobs里全是未完成任务,不需要再做状态判断,直接绑定数据即可:
@Override public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) { JobModel job = unfinishedJobs.get(position); holder.tv_provided_title.setText(job.getJob_title()); holder.tv_provided_payout.setText(job.getJob_payout()); holder.tv_provided_id.setText(job.getJob_ID()); // 原有点击事件保留 holder.tv_provided_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToDescription(v, job); } }); holder.tv_provided_payout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToDescription(v, job); } }); holder.tv_provided_id.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToDescription(v, job); } }); }
5. 新增数据刷新方法(可选但推荐)
当任务状态变更、列表新增/删除任务时,调用这个方法刷新列表:
public void refreshData(ArrayList<JobModel> updatedJobList) { this.userArrayList = updatedJobList; filterUnfinishedJobs(); notifyDataSetChanged(); }
内容的提问来源于stack exchange,提问作者Don'thavetHanswers
相关产品推荐
相关产品推荐

