首頁  >  文章  >  Java  >  如何使用 ListAdapter 修復 RecyclerView 中的 ForegroundColorSpan 搜尋文字來突出顯示問題?

如何使用 ListAdapter 修復 RecyclerView 中的 ForegroundColorSpan 搜尋文字來突出顯示問題?

Patricia Arquette
Patricia Arquette原創
2024-11-12 19:37:011030瀏覽

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);
}

透過使用更新的搜尋字串建立新的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn