Maison  >  Article  >  Java  >  Comment garantir une mise en surbrillance précise du texte de recherche dans RecyclerView avec ListAdapter ?

Comment garantir une mise en surbrillance précise du texte de recherche dans RecyclerView avec ListAdapter ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-22 05:12:21949parcourir

How to Ensure Accurate Search Text Highlighting in RecyclerView with ListAdapter?

Correction de la mise en surbrillance du texte de recherche dans RecyclerView avec ListAdapter

Lors de l'utilisation d'un SearchView avec un RecyclerView alimenté par un ListAdapter, il est crucial de mettre correctement en évidence la recherche résultats. Cependant, un problème courant survient lorsque le premier CardView de la liste ou d'autres ci-dessous peuvent ne pas mettre en surbrillance le texte recherché, ou que la mise en surbrillance se produit de manière incohérente.

La raison de ce comportement réside dans le fil d'arrière-plan utilisé par ListAdapter pour mettre à jour les vues. , ce qui pourrait rendre l'ensemble de données indisponible lors du rendu initial. Pour résoudre ce problème, envisagez les mesures suivantes :

  • Utilisez la comparaison des éléments : Assurez-vous que les listes soumises sont comparées pour déterminer quels éléments ont changé, déclenchant ainsi les mises à jour de vue appropriées.
  • Modifier le modèle Card : Introduisez une propriété searchString au modèle Card. Lors du filtrage, créez de nouvelles instances de carte avec des chaînes de recherche mises à jour. Cela déclenche une modification complète des données, obligeant ListAdapter à appeler onBindViewHolder() pour chaque élément existant.

Exemple de code

// In the ListAdapter
public class CardRVAdapter extends ListAdapter<Card, CardRVAdapter.ViewHolder> {

    private String searchString = "";

    public void setFilter(List<Card> newSearchList, String searchText) {
        if (newSearchList != null && !newSearchList.isEmpty()) {
            this.searchString = searchText;
            List<Card> filteredList = new ArrayList<>();
            for (Card card : newSearchList) {
                Card newCard = new Card(card);
                newCard.setSearchString(searchText);
                filteredList.add(newCard);
            }
            submitList(filteredList);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final Card card = getCardAt(position);
        if (card != null) {
            holder.bindData(card, position);
        }
    }
}

// In the Card model
public class Card {

    private String searchString;

    public Card(String todo, String searchString) {
        // Constructor with both original todo and search string
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }
}

En implémentant ces modifications, vous pouvez mettre en évidence avec précision le texte de recherche dans RecyclerView avec ListAdapter, quel que soit le défilement ou le rendu initial.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn