如何解决搜索结果匹配用户输入加粗时indexOf返回-1的崩溃问题
问题根源
- 未对
indexOf()返回-1(无匹配结果)的场景做拦截,直接将负数值传入substring()方法触发越界异常,是崩溃的直接原因 - 现有代码中的while循环仅做了匹配位置遍历,未实际参与富文本片段生成,逻辑冗余且无法支持多匹配项高亮
- 直接使用原始查询词插入片段列表,会导致原文本匹配部分的大小写格式被用户输入的查询词覆盖,存在隐性样式问题
修复代码
String resultText = "trending items"; String lowerResult = resultText.toLowerCase(); String lowerQuery = queriedText.toLowerCase(); List parts = []; int start = 0; int matchIdx = lowerResult.indexOf(lowerQuery); // 无匹配直接返回原文本,避免崩溃 if (matchIdx == -1) { parts.add(resultText); } else { // 遍历所有匹配位置生成渲染片段 while (matchIdx != -1) { // 添加匹配位置前的普通文本 if (matchIdx > start) { parts.add(resultText.substring(start, matchIdx).trim()); } // 用原文本切片取匹配内容,保留原有大小写格式 parts.add(resultText.substring(matchIdx, matchIdx + lowerQuery.length)); // 移动起始指针到当前匹配结束位置 start = matchIdx + lowerQuery.length; // 查找下一个匹配位置 matchIdx = lowerResult.indexOf(lowerQuery, start); } // 添加最后一段剩余文本 if (start < resultText.length) { parts.add(resultText.substring(start).trim()); } }
效果说明
- 正常匹配:用户输入
trending,结果文本为trending items时,会生成["", "trending", "items"]片段,渲染为trending items - 无匹配兼容:用户输入
trending items,结果文本为trendingitems无匹配时,直接返回原文本渲染,不会触发崩溃 - 多匹配支持:同一段文本中出现多次查询词时,所有匹配位置都会被标记为高亮
- 大小写兼容:原文本为
Trending Items、用户输入trending items时,高亮后仍保留原大写格式,显示为Trending Items
内容的提问来源于stack exchange,提问作者Stillie
相关产品推荐
相关产品推荐

