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

Android Fragment中RecyclerView集成SearchView搜索功能失效问题咨询

问题根因

你遇到的三个异常都是两个核心逻辑错误导致的:

  1. Adapter的备份数据集listfull初始化时为空:你初始化Adap的时候,Firebase还没完成异步数据加载,传入的cust_menu是空数组,后续Firebase加载完数据只更新了cust_menu,没有同步更新Adapter里的listfull,导致搜索时没有数据源可以匹配,清空搜索词后也没法恢复全部数据。
  2. 没有处理Fragment生命周期和Firebase监听器的解绑:每次切回Fragment重新走onCreateView时,会重复注册Firebase监听器,旧数据没清空会出现重复条目,且如果之前搜索筛选过,重新进入页面不会主动重置列表。

修复步骤

1. 给Adapter添加更新数据集的方法

在Adap类里新增如下方法,用来同步更新展示列表和备份列表:

// 添加到Adap类中
public void updateData(List<model> newData){
    this.list.clear();
    this.list.addAll(newData);
    this.listfull = new ArrayList<>(newData);
    notifyDataSetChanged();
}

2. 修改Fragment中Firebase数据加载的逻辑

修改Cust_Home里的ValueEventListener回调,避免重复累加数据,同时调用新增的updateData同步备份列表:

// 先把监听器声明为Fragment的成员变量,方便后续解绑
private ValueEventListener valueEventListener;

// 替换原有注册监听器的代码
valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        // 先清空旧数据,避免重复加载
        cust_menu.clear();
        for(DataSnapshot dataSnapshot : snapshot.getChildren()){
            model md = dataSnapshot.getValue(model.class);
            cust_menu.add(md);
        }
        // 调用Adapter的更新方法,同步备份列表
        cust_adapter.updateData(cust_menu);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 这里可以加日志打印错误,方便后续排查
        Log.e("FirebaseLoadErr", error.getMessage());
    }
};
data.addValueEventListener(valueEventListener);

3. 解绑Firebase监听器,避免内存泄漏和重复加载

在Cust_Home中新增onDestroyView方法,页面销毁时移除监听器:

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (data != null && valueEventListener != null) {
        data.removeEventListener(valueEventListener);
    }
}

如果你的FoodMenu数据不需要实时更新,直接用addListenerForSingleValueEvent替代addValueEventListener,就不需要手动解绑监听器,实现更简单

4. 可选:处理SearchView关闭事件,主动重置列表

在onCreateOptionsMenu里给SearchView添加关闭监听,用户点搜索框的叉号关闭搜索时,自动重置列表为全部数据:

searchView.setOnCloseListener(new SearchView.OnCloseListener() {
    @Override
    public boolean onClose() {
        cust_adapter.getFilter().filter("");
        return false;
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:04