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