問題の説明
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 サイトの他の関連記事を参照してください。