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

Base Adapter过滤异常:仅过滤前100条数据问题求助

嘿,我找到问题所在啦!

你的过滤功能只认首次加载的100条数据,根本原因是Adapter里负责过滤的原始数据源filterList,从来没更新过后续加载的新数据。

你初始化Adapter的时候,把首次加载的buses赋值给了filterList,但后续滚动加载更多数据时,只把新数据加到了显示用的mBuses里,完全没管filterList。而你的过滤逻辑全程都是基于这个“停留在初始状态”的filterList在跑,自然搜不到后面加载的内容啦。

一步步解决问题

我们只需要做两处关键修改,就能让过滤覆盖所有数据:

1. 给Adapter加一个批量添加数据的方法

在BusesArrayAdapter里新增一个方法,让它同时更新显示集合和过滤数据源,保证两者同步:

// 批量添加新数据,同时更新显示集合和过滤数据源
public void addAllBuses(ArrayList<BusModel> newBuses) {
    this.buses.addAll(newBuses);
    this.filterList.addAll(newBuses);
    notifyDataSetChanged();
}

2. 改写Activity里的加载更多逻辑

原来你直接操作mBuses然后手动通知更新,现在换成调用Adapter的新方法,让Adapter自己处理集合同步:

if (mBuses.size() < 1) { 
    // 初始化逻辑保持不变
    mBuses = buses;
    mBusesAdapter = new BusesArrayAdapter(BusesActivity.this, mBuses);
    mBusesView.setAdapter(mBusesAdapter);
} else {
    // 替换原来的addAll和notify,交给Adapter的方法处理
    mBusesAdapter.addAllBuses(buses);
}

(可选)优化过滤时的冗余代码

你在performFiltering里每次匹配到数据都new了一个新的BusModel,其实直接添加原对象就行,能省点内存:

// 把new BusModel的代码换成直接添加原对象
filterList.add(bus);
原理说明
  • filterList是过滤功能的唯一数据源,所有要被搜索的数据必须先进入这个集合;
  • 通过Adapter封装的方法来添加数据,能确保显示用的buses和过滤用的filterList始终保持一致;
  • 这种方式也符合面向对象的封装原则,避免在Activity里直接操作Adapter的内部集合。

内容的提问来源于stack exchange,提问作者user3718908x100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:53