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

如何在RecyclerView所在Fragment中添加非菜单工具栏的SearchView筛选功能?

实现MainActivity中SearchView筛选Fragment的RecyclerView数据

步骤1:在MainActivity布局中添加SearchView

打开activity_main.xml,将SearchView放置到需要的位置(比如页面顶部):

<SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="搜索分类..."
    android:iconifiedByDefault="false"/>

步骤2:在MainActivity中处理SearchView输入事件

在MainActivity的onCreate方法中绑定SearchView,监听文本变化并将搜索内容传递给HomeFragment:

public class MainActivity extends AppCompatActivity {
    private SearchView searchView;
    private HomeFragment homeFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化或获取已加载的HomeFragment
        homeFragment = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if (homeFragment == null) {
            homeFragment = new HomeFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, homeFragment)
                    .commit();
        }

        // 设置SearchView监听
        searchView = findViewById(R.id.searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                homeFragment.filterData(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                homeFragment.filterData(newText);
                return false;
            }
        });
    }
}

步骤3:修改HomeFragment添加筛选逻辑

需要保留原始数据源,避免多次筛选导致数据丢失,同时添加对外暴露的筛选方法:

public class HomeFragment extends Fragment {
    private RecyclerView recyclerView;
    private MyAdapter2 myAdapter2;
    private ArrayList<String> catLabelArrayList; // 原始全量数据
    private ArrayList<String> filteredList; // 过滤后展示的数据

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        dataInitialize();
        filteredList = new ArrayList<>(catLabelArrayList); // 初始化过滤列表为全量数据

        recyclerView = view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        myAdapter2 = new MyAdapter2(getContext(), filteredList);
        recyclerView.setAdapter(myAdapter2);
    }

    private void dataInitialize() {
        catLabelArrayList = new ArrayList<>();
        String[] newsHeading = {
                "Food",
                "Place",
                "Accesories",
        };
        Collections.addAll(catLabelArrayList, newsHeading);
    }

    // 供MainActivity调用的筛选方法
    public void filterData(String query) {
        filteredList.clear();
        if (TextUtils.isEmpty(query)) {
            // 搜索词为空时展示全量数据
            filteredList.addAll(catLabelArrayList);
        } else {
            // 模糊匹配(忽略大小写)
            String lowerQuery = query.toLowerCase();
            for (String item : catLabelArrayList) {
                if (item.toLowerCase().contains(lowerQuery)) {
                    filteredList.add(item);
                }
            }
        }
        myAdapter2.notifyDataSetChanged();
    }
}

步骤4:确认MyAdapter2适配数据更新

确保适配器基于传入的列表展示数据,核心方法示例:

public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder> {
    private Context context;
    private ArrayList<String> dataList;

    public MyAdapter2(Context context, ArrayList<String> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    // ViewHolder定义、onCreateViewHolder实现略

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        String item = dataList.get(position);
        // 绑定数据到UI组件
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
}

关键注意点

  • 必须保留原始数据源,否则多次筛选会导致数据逐步丢失
  • 模糊匹配时忽略大小写,提升用户搜索体验
  • 通过Activity直接调用Fragment公共方法传递搜索词,适合两者绑定的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:31:18