Android开发:如何获取ListView中匹配搜索内容的条目位置而非过滤条目
实现方案
你不需要调用ArrayAdapter自带的过滤逻辑,直接遍历你的原始数据源wordslist匹配输入内容即可,具体修改如下:
- 移除原有
arrayAdapter.getFilter().filter(s);代码,避免列表被过滤 - 在
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
相关产品推荐
相关产品推荐

