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 サイトの他の関連記事を参照してください。