> Java > java지도 시간 > ListAdapter를 사용하여 RecyclerView에서 ForegroundColorSpan 검색 텍스트 강조 문제를 해결하는 방법은 무엇입니까?

ListAdapter를 사용하여 RecyclerView에서 ForegroundColorSpan 검색 텍스트 강조 문제를 해결하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-12 19:37:01
원래의
1060명이 탐색했습니다.

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);
}
로그인 후 복사

업데이트된 검색 문자열로 새 카드 인스턴스를 생성하여 ListAdapter가 영향을 받은 항목에 대해 onBindViewHolder()를 트리거하도록 강제하여 강조 표시 메커니즘이 올바르게 작동하도록 합니다.

업데이트된 ListAdapter:

ListAdapter에서는 더 이상 필요하지 않으므로 searchString 속성을 제거합니다. 대신 검색 문자열 정보가 카드 모델에 포함됩니다. 이제 binData() 메서드는 다음과 같습니다.

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

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