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

Android开发:如何获取ListView中匹配搜索内容的条目位置而非过滤条目

实现方案

你不需要调用ArrayAdapter自带的过滤逻辑,直接遍历你的原始数据源wordslist匹配输入内容即可,具体修改如下:

  1. 移除原有arrayAdapter.getFilter().filter(s);代码,避免列表被过滤
  2. 在onTextChanged回调中遍历wordslist,查找和输入内容匹配的条目,直接获取对应位置(注意你需要的是从1开始计数的位置,所以找到的列表索引要+1)

修改后的代码示例

arrayAdapter = new ArrayAdapter<>(this, R.layout.activity_main, R.id.textItem, wordslist);
listView.setAdapter(arrayAdapter);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        String inputContent = s.toString().trim();
        int targetPosition = -1;
        // 遍历原始列表匹配内容
        for (int i = 0; i < wordslist.size(); i++) {
            // 这里是完全匹配逻辑,如果你需要模糊匹配可以改成 wordslist.get(i).contains(inputContent)
            if (wordslist.get(i).trim().equals(inputContent)) {
                targetPosition = i + 1; // 转成从1开始计数的位置
                break; // 只取第一个匹配的条目,需要多个匹配的话可以把位置存入列表
            }
        }
        
        if (targetPosition != -1) {
            // 匹配成功,这里可以直接使用targetPosition,示例弹吐司提示
            Toast.makeText(getApplicationContext(), "匹配位置为:" + targetPosition, Toast.LENGTH_LONG).show();
        } else {
            // 未匹配到的处理逻辑
            Toast.makeText(getApplicationContext(), "未找到匹配条目", Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void afterTextChanged(Editable s) {
    }
});

可选调整说明

  • 如果需要支持模糊匹配,把equals判断换成contains即可
  • 如果存在多个匹配的条目,把break去掉,用List<Integer>存储所有匹配的位置就行
  • 如果需要保留原有列表过滤功能同时获取位置,可以保留filter调用,同时增加上面的匹配逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:48:03