> Java > java지도 시간 > 본문

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

Susan Sarandon
풀어 주다: 2024-11-13 01:00:02
원래의
892명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿