RecyclerView фильтруемый executeFiltering () не работает после перехода на AndroidX - PullRequest
0 голосов
/ 07 декабря 2018

После перехода на AndroidX я просто заметил, что моя функция поиска больше не работает.Я проверил официальные документы здесь https://developer.android.com/reference/android/widget/Filterable, но не знаю.

Это мой адаптер RecyclerView ListProdukAdapter.kt, который реализует Filterable:

class ListProdukAdapter(private val context: Context, private val data: List<Produk>, private val act: MainActivity, private val kategori: String) : RecyclerView.Adapter<ListProdukAdapter.SampleViewHolders>(), Filterable {
    private var dataFiltered: List<Produk>? = null
    private val h: Helper
    private val a: HelperAplikasi

    init {
        this.dataFiltered = data
        this.h = act.h
        this.a = act.a
    }

    ...

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(charSequence: CharSequence): Filter.FilterResults {
                val keyword = charSequence.toString().toLowerCase()
                dataFiltered = if (keyword.isEmpty()) {
                    data
                } else {
                    val filteredList = ArrayList<Produk>()
                    var kategoriBf = ""
                    var kategoriHit = 0
                    val kategoriNum = HashMap<String, Int>()
                    for (res in data) {
                        if (!h.cekVal(res.judul) || h.cekFilter(keyword, res.judul, res.kategorI_LENGKAP, res.keywords) > 0) {
                            filteredList.add(res)
                            if (h.cekVal(res.judul)) {
                                if (kategoriBf != res.kategori && !kategoriBf.isEmpty()) {
                                    kategoriNum[kategoriBf] = kategoriHit
                                    kategoriHit = 0
                                }
                                kategoriHit++
                                kategoriBf = res.kategori
                            }
                        }
                    }
                    kategoriNum[kategoriBf] = kategoriHit
                    Log.e("kategori_num", kategoriNum.toString())
                    Log.e("kategori_num_item_bf", filteredList.size.toString() + "")
                    for (etl in filteredList) {
                        if (!h.cekVal(etl.judul)) {
                            val jumlah = kategoriNum[etl.kategori]
                            if (jumlah == null || jumlah < 1)
                                etl.stok = 0
                            else
                                etl.stok = jumlah
                        }
                    }
                    Log.e("kategori_num_item_af", filteredList.size.toString() + "")
                    filteredList
                }
                val filterResults = Filter.FilterResults()
                filterResults.values = dataFiltered ?: ArrayList<Produk>()
                return filterResults
            }

            override fun publishResults(charSequence: CharSequence, filterResults: Filter.FilterResults) {
                @Suppress("UNCHECKED_CAST")
                dataFiltered = filterResults.values as ArrayList<Produk>
                notifyDataSetChanged()
            }
        }
    }

    ...

}

Обратите внимание, что он работает какочарование, прежде чем я мигрировать на AndroidX.Мой h.cekFilter() метод - просто мой пользовательский помощник для проверки строк, содержит ли он ключевое слово или нет, никаких проблем там нет.Теперь я получаю этот сбой всякий раз, когда я набираю что-либо в своем поисковом вводе:

kotlin.TypeCastException: null cannot be cast to non-null type kotlin.collections.ArrayList<com.jukat.jualdekat.objects.Produk> /* = java.util.ArrayList<com.jukat.jualdekat.objects.Produk> */
        at com.jukat.jualdekat.adapters.ListProdukAdapter$getFilter$1.publishResults(ListProdukAdapter.kt:239)
        at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5692)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

Когда я пытаюсь изменить (номер строки 239) с dataFiltered = filterResults.values as ArrayList<Produk> на dataFiltered = filterResults.values as ArrayList<Produk>?, результат равен нулю, даже когда я набираю 1 буквучто, очевидно, содержится в данных.Да, я получил ту же ошибку во всех других моих действиях, которые используют аналогичную реализацию.Пожалуйста, помогите.

enter image description here

enter image description here

1 Ответ

0 голосов
/ 07 декабря 2018

Простите, ребята.Я потратил несколько часов, чтобы разобраться с этой проблемой, и в конце концов я обнаружил, что это на самом деле.По-видимому, эта проблема вообще не связана с AndroidX, а из-за моего пользовательского метода, который находится в моем классе Helper, который мне пришлось преобразовать из Java в Kotlin прямо перед тем, как я перешел на AndroidX, что затем заставило меня ошибиться.

Метод performFiltering() имеет параметр CharSequence, допускающий значение NULL, поэтому в моем методе h.cekFilter(), как показано ниже, должен быть CharSequence?.

fun cekFilter(keyword: CharSequence?, vararg teks: CharSequence?): Int {
    ...
}

Другая проблема заключается в том, что Logcat не показывает никаких признаковошибки в моем Helper классе, вместо этого мой performFilter() остановился на полпути и затем передал ноль filterResults.values в publishResults(), что затем вызвало исключение в Logcat.Weird.

...