选择BottomSheetDialogFragment分类后点击底部导航HomeFragment搜索失效求助
问题根因
- 分类选择逻辑错误:BottomSheet中选中分类时手动创建了新的HomeFragment实例替换当前页面,和底部导航组件维护的HomeFragment实例完全脱节。点击底部导航的Home选项时,系统会恢复导航组件管理的原始HomeFragment实例,该实例要么没有携带选中的分类参数,要么没有执行过数据拉取逻辑,导致搜索依赖的
srchProductsList数据源为空,自然无法返回搜索结果。 - 数据加载时机不合理:
getProductList大概率仅在Fragment首次创建的生命周期(如onViewCreated)中执行,当Fragment从其他底部tab切回显示时,不会重新触发数据拉取,进一步导致数据源异常。
修复方案
1. 修正分类参数传递逻辑
不要手动创建HomeFragment实例替换,改为通过Fragment Result API通知已存在的HomeFragment更新分类:
// BottomSheetDialogFragment分类点击逻辑修改 categoryAdapter.setOnClickListener(object :HomeCategoryListAdapter.OnClickListener{ override fun onClick(position: Int, category: Categories) { val result = Bundle() result.putString("selectedCategory", if (category.category == "All Products") null else category.category) parentFragmentManager.setFragmentResult("category_select_key", result) dismiss() } }) // HomeFragment的onViewCreated中监听分类选择结果 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 监听分类选择结果 parentFragmentManager.setFragmentResultListener("category_select_key", viewLifecycleOwner) { _, bundle -> filterCategory = bundle.getString("selectedCategory") getProductList() // 收到分类后重新拉取对应商品数据 } // 其余原有初始化逻辑 }
2. 优化数据加载时机
确保HomeFragment切回前台时能正确加载对应数据:
override fun onResume() { super.onResume() // 若有需要可以加判断:当前分类和上次加载的分类一致时跳过拉取,减少请求次数 getProductList() }
3. 可选优化搜索性能
将列表刷新逻辑移到循环外,避免遍历每个商品都触发不必要的页面刷新:
override fun onQueryTextChange(newText: String?): Boolean { srchTempProductsList.clear() val searchText = newText!!.toLowerCase(Locale.getDefault()) if (searchText.isNotEmpty()) { srchProductsList.forEach { if (it.label.toLowerCase(Locale.getDefault()).contains(searchText)) { srchTempProductsList.add(it) } } // 遍历结束后统一刷新 binding.rvHomeItems.adapter?.notifyDataSetChanged() if (srchTempProductsList.isEmpty()) { showCustomAlertDialog() } } else { srchTempProductsList.clear() srchTempProductsList.addAll(srchProductsList) binding.rvHomeItems.adapter?.notifyDataSetChanged() } return false } // onQueryTextSubmit方法也做同样的循环外刷新修改即可
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

