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
相关产品推荐
相关产品推荐

