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自带的过滤功能:
- 首先把Adapter改为全局变量:
ArrayAdapter<String> adapter;
- onCreate中初始化Adapter:
adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, android.R.id.text1, items); listView.setAdapter(adapter);
- 简化搜索逻辑,不需要自己创建临时列表和新Adapter:
@Override public boolean onQueryTextChange(String newText) { adapter.getFilter().filter(newText); return true; }
内容的提问来源于stack exchange,提问作者TheGrovN
相关产品推荐
相关产品推荐

