ホームページ > Java > &#&チュートリアル > ListAdapter を使用した RecyclerView での検索テキストの強調表示が一部の CardView で正しく表示されないのはなぜですか?

ListAdapter を使用した RecyclerView での検索テキストの強調表示が一部の CardView で正しく表示されないのはなぜですか?

Susan Sarandon
リリース: 2024-11-13 01:00:02
オリジナル
1000 人が閲覧しました

Why is search text highlighting in RecyclerView using ListAdapter failing to display correctly on some CardViews?

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

問題の説明

RecyclerView の CardView リストはツールバー内の SearchView の下にあります。 Color.GREEN による検索テキストの強調表示は、ListAdapter の onBindViewHolder() メソッドで実装されることを目的としています。ただし、RecyclerView リストの最初の CardView と後続の他の CardView では、強調表示されたテキストが表示されず、検索テキストの可視性が妨げられることがよくあります。この問題は、ListAdapter をアダプターとして使用することに関連している可能性があります。

コードスニペット

MainActivity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
      return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
      filter(newText);
      return false;
    }
  });
  return true;
}

private void filter(String searchText) {
  ArrayList<Card> searchList = new ArrayList<>();
  for (Card cardItem : mCards) {
    if (cardItem.getTodo().toLowerCase(Locale.US).contains(searchText)) {
      searchList.add(cardItem);
    }
  }
  if (!searchList.isEmpty()) {
    adapter.setFilter(searchList, searchText);
  }
}
ログイン後にコピー

ListAdapter

public class CardRVAdapter extends ListAdapter<Card, CardRVAdapter.ViewHolder> {
  private String searchString = "";
  public Spannable spannable;

  public void setFilter(List<Card> newSearchList, String adapSearchText) {
    if (newSearchList != null && !newSearchList.isEmpty()) {
      this.searchString = adapSearchText.toLowerCase(Locale.US);
      ArrayList<Card> tempList = new ArrayList<>(newSearchList);
      submitList(tempList);
    }
  }

  public class ViewHolder extends RecyclerView.ViewHolder {
    TextView carBlankText2;  // displays text in the CardView and is matched against the search text input.
    ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);

    public ForegroundColorSpan getFCS() {
      return fcs;
    }
  }

  public ViewHolder(@NonNull final View itemView) {
    super(itemView);
    cardBlankText2 = itemView.findViewById(R.id.cardBlankText2);
  }

  void bindData(Card card, final int position) {
    spannable = Spannable.Factory.getInstance().newSpannable(cardBlankText2.getText().toString());

    // Get any previous spans and remove them
    ForegroundColorSpan[] foregroundSpans = spannable.getSpans(0, spannable.length(), ForegroundColorSpan.class);
    for (ForegroundColorSpan span : foregroundSpans) {
      spannable.removeSpan(span);
    }

    // Highlight matches from search characters is Green color.
    if (searchString != null && !TextUtils.isEmpty(searchString)) {
      int index = spannable.toString().toLowerCase(Locale.US).indexOf(searchString);
      while (index != -1) {
        spannable.setSpan(getFCS(), index, index + searchString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        index = spannable.toString().indexOf(searchString, index + searchString.length());
      }
      cardBlankText2.setText(spannable, TextView.BufferType.SPANNABLE);
    }
  }

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

  public Card getCardAt(int position) {
    return getItem(position);
  }
}
ログイン後にコピー

ソリューション

へ強調表示の問題を修正するには、ListAdapter の setFilter メソッドに重要な変更を加える必要があります。

public void setFilter(List<Card> newSearchList, String adapSearchText) {
  if (newSearchList != null && !newSearchList.isEmpty()) {
    ArrayList<Card> tempList = new ArrayList<>();
    for (Card card: newSearchList) {
      card.setSearchString(adapSearchText.toLowerCase(Locale.US));
      tempList.add(card);
    }
    submitList(tempList);
  }
}
ログイン後にコピー

カード モデルに setSearchString メソッドを追加し、フィルタリング時にその値を設定することで、データ変更をトリガーします。 onBindViewHolder() メソッドが呼び出され、その後、検索テキストの強調表示が更新されます。

以上がListAdapter を使用した RecyclerView での検索テキストの強調表示が一部の CardView で正しく表示されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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