SearchView搭配OnClickListener失效:搜索后ListView点击无响应求助
ArrayAdapter结合SearchView搜索后ListView点击事件失效问题
使用ArrayAdapter实现SearchView搜索功能时出现异常:当SearchView为空时,ListView列表项点击可正常跳转到对应Fragment;但输入内容完成搜索后,点击列表项仅触发点击动作,却无跳转结果。
相关代码
MainActivity.kt核心逻辑代码
lateinit var adapter:ArrayAdapter<String> .... var user = arrayOf("Home","Dog","Cat","Hamster") adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, user) binding.categories.adapter = adapter binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { if (user.contains(query)) { adapter.filter.filter(query) } else { Toast.makeText(this@MainActivity, "No Match found", Toast.LENGTH_LONG).show() } return false } override fun onQueryTextChange(newText: String): Boolean { adapter.filter.filter(newText) return false } }) val home = adapter.getItemId(0) val cat = adapter.getItemId(1) val hamster = adapter.getItemId(2) val dog = adapter.getItemId(3) binding.categories.setOnItemClickListener { parent, view, position, ID -> when(ID){ home ->{navController.navigate(R.id.action_global_home2) } cat -> {navController.navigate(R.id.action_global_cat) } hamster -> {navController.navigate(R.id.action_global_hamster)} dog -> {navController.navigate(R.id.action_global_dog) } } }
MainActivity.xml布局代码
<!--searchview--> <androidx.appcompat.widget.SearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:layout_marginTop="30dp" android:layout_marginBottom="16dp" app:queryHint="Enter Search" android:background="@drawable/searchview_background" app:iconifiedByDefault="false" app:queryBackground="@android:color/transparent" > </androidx.appcompat.widget.SearchView> <!--Listview--> <ListView android:id="@+id/categories" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" tools:listitem="@layout/searchview_listitem"/>
现象截图
- 图1:SearchView为空时点击正常跳转

- 图2:搜索后点击无响应

问题根源与解决方案
问题原因
点击事件中通过预存的getItemId值进行跳转判断,但ArrayAdapter执行过滤后会生成新的过滤数据集,此时列表项的getItemId()默认返回过滤后列表的position,而非原始数据的索引。比如搜索后列表只剩一项,它的ID是0,但你提前存储的home是原始未过滤列表第0项的ID,此时点击的ID和预存值不匹配,导致when分支无触发,自然没有跳转动作。
解决方案
修改点击事件逻辑,直接通过当前选中项的文本内容判断跳转,逻辑直观且不易出错:
binding.categories.setOnItemClickListener { parent, view, position, ID -> val selectedItem = adapter.getItem(position) ?: return@setOnItemClickListener when(selectedItem){ "Home" -> navController.navigate(R.id.action_global_home2) "Cat" -> navController.navigate(R.id.action_global_cat) "Hamster" -> navController.navigate(R.id.action_global_hamster) "Dog" -> navController.navigate(R.id.action_global_dog) } }
也可以自定义ArrayAdapter并重写getItemId()方法,让每个项绑定固定的原始索引ID,但这种方式相对繁琐,上述文本匹配方案更简洁高效。
内容的提问来源于stack exchange,提问作者Theprogrammingnoob
相关产品推荐
相关产品推荐

