Kotlin SearchView返回问题:点击返回键直接退出应用而非返回RecyclerView列表
问题根因
你当前的代码在触发搜索时直接清空了RecyclerView绑定的全局数据源postArrayList,没有保留搜索前的原始列表备份。点击系统返回键时,当前页面没有拦截返回事件先恢复原始列表数据,直接触发了页面销毁逻辑,所以看起来应用直接关闭。
解决步骤
- 第一步:新增全局变量存储原始列表和搜索状态标记
// 替换<PostBean>为你实际的列表数据类名 private val originalPostList = ArrayList<PostBean>() private var isSearchMode = false - 第二步:修改原始列表加载逻辑,拉取到的数据同时同步给原始列表变量
private fun loadPosts() { // 保留原有数据请求逻辑不变 val loadedData = // 你接口返回的原始列表数据 originalPostList.clear() originalPostList.addAll(loadedData) postArrayList.clear() postArrayList.addAll(loadedData) yourAdapter.notifyDataSetChanged() } - 第三步:优化搜索逻辑,搜索结果仅修改展示用的数据源,不改动原始列表
searchBtn.setOnClickListener { url = "" val query = searchEt.text.toString().trim() if(TextUtils.isEmpty(query)){ // 搜索框为空直接恢复原始列表 isSearchMode = false postArrayList.clear() postArrayList.addAll(originalPostList) yourAdapter.notifyDataSetChanged() loadPosts() } else { isSearchMode = true searchPosts(query) } } // searchPosts方法内仅把搜索结果赋值给postArrayList刷新即可,不要修改originalPostList - 第四步:拦截返回键逻辑,搜索状态下先恢复原始列表,再走正常返回逻辑
Activity场景:
Fragment场景:override fun onBackPressed() { if (isSearchMode) { // 退出搜索模式,恢复原始列表 isSearchMode = false searchEt.setText("") postArrayList.clear() postArrayList.addAll(originalPostList) yourAdapter.notifyDataSetChanged() return } super.onBackPressed() }override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { if (isSearchMode) { isSearchMode = false searchEt.setText("") postArrayList.clear() postArrayList.addAll(originalPostList) yourAdapter.notifyDataSetChanged() } else { isEnabled = false requireActivity().onBackPressed() } } }
额外优化提示
你原有代码中postArrayList = ArrayList()后立刻调用postArrayList.clear()属于冗余操作,刚创建的空列表不需要额外清空,可以删除其中任意一行。
内容的提问来源于stack exchange,提问作者GAIUS12100
相关产品推荐
相关产品推荐

