После перехода на 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](https://i.stack.imgur.com/kRVTr.png)
![enter image description here](https://i.stack.imgur.com/RAYg8.png)