You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

筛选后RecyclerView列表大小更新但内容未正确变更问题咨询

问题根因

你的FilterCidadeAdapter中存在两个完全独立的城市数据集合,逻辑不统一导致展示异常:

  • 绑定列表项内容的onBindViewHolder方法从data集合取数,该集合仅在Adapter初始化时赋值全量城市列表,筛选逻辑执行后从未更新
  • 统计列表长度的getItemCount方法返回cidades集合的大小,筛选逻辑仅更新了这个集合的内容

所以筛选后列表长度会匹配查询结果的数量,但渲染的始终是全量城市列表中对应的前N条数据。

修复方案

推荐采用第一种方案,移除冗余集合降低维护成本:

方案1:统一使用data集合承载所有列表数据

  1. 修改Adapter的getItemCount方法,返回data集合的长度:
@Override
public int getItemCount() {
    return data.size();
}
  1. 在Adapter中新增数据更新方法,供外部调用刷新列表:
public void updateFilteredData(ArrayList<Cidade> filteredList) {
    this.data.clear();
    this.data.addAll(filteredList);
}
  1. 修改Activity中reload方法的更新逻辑,替换原有操作cidades集合的代码:
// 删除原有两行adapter.cidades操作代码
adapter.updateFilteredData(cidades);

方案2:保留cidades作为专属筛选集合

如果业务需要保留全量data集合做其他逻辑,可调整绑定逻辑对齐数据源:

  1. 在Adapter构造方法中初始化cidades的默认值:
public FilterCidadeAdapter(Context context, int layoutResourceId, ArrayList<Cidade> data){
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
    // 新增初始化逻辑
    this.cidades.addAll(data);
}
  1. 修改onBindViewHolder的取数逻辑,从cidades集合取值:
@Override
public void onBindViewHolder(@NonNull FilterCidadeAdapter.ViewHolder holder, int position) {
    final Cidade item = cidades.get(position);
    // 剩余原有逻辑保持不变
}
额外优化建议
  • 不需要在onBindViewHolder中每次获取数据库实例,该逻辑无意义可删除
  • 代码中无意义的循环Handler逻辑可移除,避免内存泄漏

内容的提问来源于stack exchange,提问作者Fabrício Gerhardt Jr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:00:02