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); }
透過使用更新的搜尋字串建立新的Card 實例,我們強制ListAdapter 為受影響的項目觸發onBindViewHolder(),確保突出顯示機制正常運作。
更新了 ListAdapter:
在 ListAdapter 中,我們刪除了 searchString 屬性,因為它不再需要了。相反,搜尋字串資訊包含在 Card 模型中。現在,bindData() 方法應如下所示:
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中文網其他相關文章!