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

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为空时点击正常跳转
    图1
  • 图2:搜索后点击无响应
    图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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:18:33