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

Android ListView搭配SearchView搜索后点击条目跳转Activity错误如何解决

问题根源
  • 你当前的跳转逻辑绑定的是原始列表的固定position,但搜索筛选后列表替换为了仅包含匹配结果的新列表,此时点击事件返回的position是筛选后列表的位置,和原始列表的position没有对应关系,所以会出现跳转错位。
  • 原始逻辑对应错误:原始列表索引4对应的是st33、索引5对应st34、索引6对应st35,但你代码中case4跳转的是Activity_st31、case6跳转的是Activity_st33,对应关系完全错位,需要先修正。
  • 代码笔误:初始化Adapter时拼写为ArryAdapter,正确应为ArrayAdapter,会导致编译失败。
解决方法

推荐使用方案2,逻辑更稳定无索引依赖:

方案1:通过点击内容获取原始列表的真实索引

修改ListView的点击事件逻辑,先拿到点击的条目内容,再查找该内容在原始items列表中的索引,用这个索引走switch判断:

listView.setOnItemClickListener((adapterView, view, position, l) -> {
    String clickedItem = adapterView.getItemAtPosition(position).toString();
    Toast.makeText(MainActivity.this, "click -" + clickedItem, Toast.LENGTH_LONG).show();
    // 获取点击条目在原始列表中的真实索引
    int originalPosition = items.indexOf(clickedItem);
    switch (originalPosition) {
        case 0:
            startActivity(new Intent(MainActivity.this, Activity_st17.class));
            break;
        case 1:
            startActivity(new Intent(MainActivity.this, Activity_st18.class));
            break;
        case 2:
            startActivity(new Intent(MainActivity.this, Activity_st23.class));
            break;
        case 3:
            startActivity(new Intent(MainActivity.this, Activity_st29.class));
            break;
        case 4:
            startActivity(new Intent(MainActivity.this, Activity_st33.class));
            break;
        case 5:
            startActivity(new Intent(MainActivity.this, Activity_st34.class));
            break;
        case 6:
            startActivity(new Intent(MainActivity.this, Activity_st35.class));
            break;
    }
});

方案2:直接通过点击条目内容匹配跳转(更稳妥)

不需要依赖索引,直接根据点击的字符串判断跳转目标,彻底避免索引对应错误:

listView.setOnItemClickListener((adapterView, view, position, l) -> {
    String clickedItem = adapterView.getItemAtPosition(position).toString();
    Toast.makeText(MainActivity.this, "click -" + clickedItem, Toast.LENGTH_LONG).show();
    Intent intent = null;
    switch (clickedItem) {
        case "st17":
            intent = new Intent(MainActivity.this, Activity_st17.class);
            break;
        case "st18":
            intent = new Intent(MainActivity.this, Activity_st18.class);
            break;
        case "st23":
            intent = new Intent(MainActivity.this, Activity_st23.class);
            break;
        case "st29":
            intent = new Intent(MainActivity.this, Activity_st29.class);
            break;
        case "st33":
            intent = new Intent(MainActivity.this, Activity_st33.class);
            break;
        case "st34":
            intent = new Intent(MainActivity.this, Activity_st34.class);
            break;
        case "st35":
            intent = new Intent(MainActivity.this, Activity_st35.class);
            break;
    }
    if (intent != null) {
        startActivity(intent);
    }
});

可选优化:复用适配器提升性能

你当前的搜索逻辑每次输入变化都新建Adapter,性能较差,可以改为使用ArrayAdapter自带的过滤功能:

  1. 首先把Adapter改为全局变量:
ArrayAdapter<String> adapter;
  1. onCreate中初始化Adapter:
adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, android.R.id.text1, items);
listView.setAdapter(adapter);
  1. 简化搜索逻辑,不需要自己创建临时列表和新Adapter:
@Override
public boolean onQueryTextChange(String newText) {
    adapter.getFilter().filter(newText);
    return true;
}

内容的提问来源于stack exchange,提问作者TheGrovN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:03