Android : résolution des problèmes de mise en surbrillance du texte de recherche ForegroundColorSpan avec RecyclerView et ListAdapter
La mise en surbrillance du texte de recherche dans un RecyclerView peut être difficile, en particulier lors de l'utilisation de ListAdapter . Pour résoudre ce problème, explorons une solution potentielle pour garantir que le texte de recherche est correctement mis en évidence à l'aide d'un ListAdapter personnalisé.
Le problème survient lors de l'utilisation de submitList() pour mettre à jour l'ensemble de données dans ListAdapter. Bien qu'il supprime correctement les éléments de la liste, il ne parvient pas à déclencher onBindViewHolder() pour les éléments existants car leurs données restent inchangées. Il en résulte que le mécanisme de mise en évidence ne fonctionne pas comme prévu pour ces éléments.
Solution :
Pour résoudre ce problème, nous devons modifier la logique de filtrage pour créer une nouvelle carte. modèles avec des chaînes de recherche mises à jour au lieu de modifier les modèles existants sur place. Voici le code révisé dans MainActivity :
private void filter(String searchText) { ArrayList<Card> searchList = new ArrayList<>(); for (Card cardItem : mCards) { if (cardItem.getTodo().toLowerCase().contains(searchText.toLowerCase(Locale.US))) { Card updatedCard = new Card(cardItem.getTodo(), searchText); searchList.add(updatedCard); } } if (!searchList.isEmpty()) { adapter.setFilter(searchList); }
En créant de nouvelles instances de Card avec des chaînes de recherche mises à jour, nous forçons le ListAdapter à déclencher onBindViewHolder() pour les éléments concernés, garantissant ainsi que le mécanisme de mise en évidence fonctionne correctement.
ListAdapter mis à jour :
Dans le ListAdapter, nous supprimons la propriété searchString car elle n'est plus nécessaire. Au lieu de cela, les informations de la chaîne de recherche sont incluses dans le modèle Card. La méthode bindData() devrait maintenant ressembler à ceci :
void bindData(Card card) { spannable = Spannable.Factory.getInstance().newSpannable(cardBlankText2.getText().toString()); // Get any previous spans and remove them ForegroundColorSpan[] foregroundSpans = spannable.getSpans(0,spannable.length(), ForegroundColorSpan.class); // Highlight matches from search characters is Green color. if (card.getSearchText() != null) { int start = cardBlankText2.getText().toString().toLowerCase(Locale.US).indexOf(card.getSearchText().toLowerCase(Locale.US)); int end = start + card.getSearchText().length(); if (start != -1) { spannable.setSpan(getFCS(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } cardBlankText2.setText(spannable, TextView.BufferType.SPANNABLE); } }
Avec ces modifications, la fonction de mise en surbrillance du texte de recherche devrait fonctionner comme prévu dans RecyclerView, garantissant que chaque occurrence de la chaîne de recherche est mise en évidence de manière appropriée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!