Destacando palavras em uma string

Ao preencher um ListView, eu esperava destacar algumas palavras-chave nas entradas correspondentes TextView. Eu tinha uma classe para meus dados e um ArrayAdapter personalizado para dar corpo a eles, mas isso pode ser facilmente modificado para funcionar em uma entrada.

private Spannable highlightSearchKey(String title) {
Spannable highlight;
Pattern pattern;
Matcher matcher;
int word_index;
String title_str;

word_index
= words.length;
title_str
= Html.fromHtml(title).toString();
highlight
= (Spannable) Html.fromHtml(title);
for (int index = 0; index < word_index; index++) {
pattern
= Pattern.compile("(?i)" + words[index]);
matcher
= pattern.matcher(title_str);
while (matcher.find()) {
highlight
.setSpan(
new BackgroundColorSpan(0x44444444),
matcher
.start(),
matcher
.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return highlight;
}

O loop FOR itera sobre cada palavra em uma frase de palavra-chave, cria um padrão de expressão regular (que não faz distinção entre maiúsculas e minúsculas) e um matcher correspondente para pegar cada correspondência na string principal (‘título’). O loop WHILE usa a função setSpan para criar uma caixa de fundo em cada índice de ‘início’ e ‘fim’ de uma palavra-chave. Depois de concluído, o Spannable retornado pode ser usado por um TextView diretamente.