Android SearchSuggestSelection permite que a consulta comece com em vez de conter a pesquisa

StackOverflow https://stackoverflow.com//questions/11649194

  •  11-12-2019
  •  | 
  •  

Pergunta

Estou usando o Android SearchRecentSuggestionsProvider e Configuração pesquisável deseja exibir pesquisas anteriores em aplicativos e gostaria de limitar as respostas sugeridas para retornar apenas entradas que começam com ?(o que o usuário está digitando)

atualmente "p" retorna telefone, ipod, foto, feliz, e o que procuro é apenas telefone e foto

Algo equivalente ao SQL como%, mas não consigo fazer isso funcionar.

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/product_search_hint"
    android:imeOptions="actionSearch"
    android:label="@string/app_label"
    android:searchSuggestAuthority="com.myapp.ProductSearchSuggestionProvider"
    android:searchSuggestSelection="word MATCH ?" >
</searchable>

Testado:

android:searchSuggestSelection="WORD LIKE '%'?"
Foi útil?

Solução

Se você estivesse implementando um provedor de sugestões totalmente personalizado, a aplicação de personalizações nesse nível funcionaria conforme o esperado.No entanto, nos bastidores, SearchRecentSuggestionsProvider consulta sua tabela local com os seguintes argumentos codificados (dar uma olhada):

  • seleção = "display1 GOSTOU?"
  • seleçãoArgs = ["%{query}%"]

onde {query} é a consulta de pesquisa (está imprensada entre sinais de dois por cento para que qualquer caractere corresponda em qualquer lugar da string).Ele ignora o valor passado para a string de seleção (que é o que você está definindo com o searchSuggestSelection parâmetro) e o array args (além de verificar se está vazio), então não há muito que você possa fazer com XML.

Como a implementação ignora os parâmetros recebidos, não há correção ou substituição fácil.Para evitar codificação duplicada, eu:

  1. Copie toda a implementação de SearchRecentSuggestionsProvider do link acima.Nada que a classe faça deve ser privado da estrutura, portanto, uma cópia direta deve ser compilada.
  2. Modifique a instrução de construção do array args, dentro do query() método, ser String like = selectionArgs[0] + "%" em vez de String like = "%" + selectionArgs[0] + "%" (ou seja,remova a primeira porcentagem)
  3. Subclasse ProductSearchSuggestionProvider da sua nova implementação.

Outras dicas

Você já tentou concatenação de strings?

word LIKE ? || '%'

|| é a concatenação de strings no SQLite.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top