ListAdapter を使用して RecyclerView で ForegroundColorSpan 検索テキストの強調表示の問題を修正する方法

Patricia Arquette
リリース: 2024-11-12 19:37:01
オリジナル
995 人が閲覧しました

How to Fix ForegroundColorSpan Search Text Highlighting Issues in RecyclerView with ListAdapter?

Android: RecyclerView と ListAdapter による ForegroundColorSpan 検索テキストの強調表示の問題を解決する

RecyclerView での検索テキストの強調表示は、特に ListAdapter を使用する場合に困難になることがあります。 。この問題に対処するために、カスタム ListAdapter を使用して検索テキストが正しく強調表示されるようにするための潜在的な解決策を検討してみましょう。

この問題は、submitList() を使用して ListAdapter 内のデータセットを更新するときに発生します。リストから項目は正しく削除されますが、既存の項目のデータは変更されないため、onBindViewHolder() をトリガーできません。この結果、これらの項目に対して強調表示メカニズムが意図したとおりに機能しなくなります。

解決策:

この問題を解決するには、フィルタリング ロジックを変更して新しいカードを作成する必要があります。既存のモデルをその場で変更するのではなく、更新された検索文字列を使用してモデルを作成します。 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);
}
ログイン後にコピー

更新された検索文字列を使用して新しい Card インスタンスを作成することで、ListAdapter が影響を受けるアイテムに対して onBindViewHolder() を強制的にトリガーし、強調表示メカニズムが正しく動作するようにします。

更新された ListAdapter:

ListAdapter では、不要になった searchString プロパティを削除しました。代わりに、検索文字列情報がカード モデルに含まれます。 bindData() メソッドは次のようになります。

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);
    }    
}
ログイン後にコピー

これらの変更により、検索テキストの強調表示機能が RecyclerView で期待どおりに動作し、検索文字列のすべての出現が適切に強調表示されるようになります。

以上がListAdapter を使用して RecyclerView で ForegroundColorSpan 検索テキストの強調表示の問題を修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート