Android: Beheben von Problemen beim Hervorheben von ForegroundColorSpan-Suchtext mit RecyclerView und ListAdapter
Das Hervorheben von Suchtext in einem RecyclerView kann eine Herausforderung sein, insbesondere wenn ListAdapter verwendet wird . Um dieses Problem zu beheben, untersuchen wir eine mögliche Lösung, um sicherzustellen, dass Suchtext mithilfe eines benutzerdefinierten ListAdapters korrekt hervorgehoben wird.
Das Problem tritt auf, wenn „submitList()“ zum Aktualisieren des Datensatzes im ListAdapter verwendet wird. Elemente werden zwar ordnungsgemäß aus der Liste entfernt, onBindViewHolder() wird jedoch nicht für vorhandene Elemente ausgelöst, da deren Daten unverändert bleiben. Dies führt dazu, dass der Hervorhebungsmechanismus für diese Elemente nicht wie vorgesehen funktioniert.
Lösung:
Um dieses Problem zu beheben, müssen wir die Filterlogik ändern, um eine neue Karte zu erstellen Modelle mit aktualisierten Suchzeichenfolgen, anstatt die vorhandenen Modelle direkt zu ändern. Hier ist der überarbeitete Code in 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); }
Durch die Erstellung neuer Karteninstanzen mit aktualisierten Suchzeichenfolgen erzwingen wir, dass der ListAdapter onBindViewHolder() für betroffene Elemente auslöst, um sicherzustellen, dass der Hervorhebungsmechanismus ordnungsgemäß funktioniert.
Aktualisierter ListAdapter:
Im ListAdapter entfernen wir die searchString-Eigenschaft als es ist nicht mehr notwendig. Stattdessen sind die Suchzeichenfolgeninformationen im Kartenmodell enthalten. Die bindData()-Methode sollte nun wie folgt aussehen:
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); } }
Mit diesen Änderungen sollte die Suchtext-Hervorhebungsfunktion in RecyclerView wie erwartet funktionieren und sicherstellen, dass jedes Vorkommen der Suchzeichenfolge entsprechend hervorgehoben wird.
Das obige ist der detaillierte Inhalt vonWie behebt man Probleme mit der Hervorhebung von ForegroundColorSpan-Suchtext in RecyclerView mit ListAdapter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!