Rumah > Java > javaTutorial > Bagaimana untuk Membetulkan Isu Menyerlahkan Teks Carian ForegroundColorSpan dalam RecyclerView dengan ListAdapter?

Bagaimana untuk Membetulkan Isu Menyerlahkan Teks Carian ForegroundColorSpan dalam RecyclerView dengan ListAdapter?

Patricia Arquette
Lepaskan: 2024-11-12 19:37:01
asal
1060 orang telah melayarinya

How to Fix ForegroundColorSpan Search Text Highlighting Issues in RecyclerView with ListAdapter?

Android: Menyelesaikan Isu Menyerlahkan Teks Carian ForegroundColorSpan dengan RecyclerView dan ListAdapter

Menyerlahkan teks carian dalam RecyclerView boleh menjadi mencabar, terutamanya apabila menggunakan ListAdapter . Untuk menangani isu ini, mari kita terokai penyelesaian yang berpotensi untuk memastikan teks carian diserlahkan dengan betul menggunakan ListAdapter tersuai.

Masalah timbul apabila menggunakan submitList() untuk mengemas kini set data dalam ListAdapter. Walaupun ia mengalih keluar item dengan betul daripada senarai, ia gagal mencetuskan onBindViewHolder() untuk item sedia ada kerana data mereka kekal tidak berubah. Ini mengakibatkan mekanisme penyerlahan tidak berfungsi seperti yang dimaksudkan untuk item ini.

Penyelesaian:

Untuk menyelesaikan isu ini, kami perlu mengubah suai logik penapisan untuk mencipta Kad baharu model dengan rentetan carian yang dikemas kini dan bukannya mengubah suai model sedia ada di tempat. Berikut ialah kod yang disemak dalam 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);
}
Salin selepas log masuk

Dengan mencipta kejadian Kad baharu dengan rentetan carian yang dikemas kini, kami memaksa ListAdapter untuk mencetuskan onBindViewHolder() untuk item yang terjejas, memastikan mekanisme penyerlahan berfungsi dengan betul.

Dikemas kini ListAdapter:

Dalam ListAdapter, kami mengalih keluar sifat searchString kerana ia tidak lagi diperlukan. Sebaliknya, maklumat rentetan carian disertakan dalam model Kad. Kaedah bindData() kini sepatutnya kelihatan seperti ini:

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);
    }    
}
Salin selepas log masuk

Dengan perubahan ini, ciri penyerlahan teks carian harus berfungsi seperti yang diharapkan dalam RecyclerView, memastikan bahawa setiap kejadian rentetan carian diserlahkan dengan sewajarnya.

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Isu Menyerlahkan Teks Carian ForegroundColorSpan dalam RecyclerView dengan ListAdapter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan