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

