>  기사  >  Java  >  ListAdapter를 사용하여 RecyclerView에서 검색 텍스트 강조 표시가 일부 CardView에서 올바르게 표시되지 않는 이유는 무엇입니까?

ListAdapter를 사용하여 RecyclerView에서 검색 텍스트 강조 표시가 일부 CardView에서 올바르게 표시되지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-13 01:00:02885검색

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

Android: RecyclerView 및 ListAdapter의 ForegroundColorSpan 검색 텍스트 강조 문제 해결

문제 설명

CardView의 RecyclerView 목록은 다음과 같습니다. 툴바 내 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.