【问题标题】:RecyclerView Filter is not filtering (Kotlin)RecyclerView 过滤器不过滤 (Kotlin)
【发布时间】:2021-11-12 22:41:40
【问题描述】:

我启动了调试器,我的断点显示,在第一次启动时,数据集正在传输,因为适配器正在初始化,但是一旦我调用过滤器,它就没有任何数据可以使用,而我的 recyclerview 只是保持原样。

所有这些代码之前都可以使用,我只是将它从 Java 翻译成 Kotlin。我一定是搞砸了,但我找不到。

适配器类

class ClothingListAdapterKt(
private val dataSetIn: MutableList<Clothing>,
private val listener: ClothingListAdapterKt.OnItemClickListener,
private val context: Context
) :
RecyclerView.Adapter<ClothingListAdapterKt.ViewHolder>(), Filterable {

private var lastPosition = -1
var dataSet = mutableListOf<Clothing>()
var dataSetFiltered = mutableListOf<Clothing>()

init {
    dataSet = dataSetIn
    dataSetFiltered = dataSet
}

override fun onBindViewHolder(viewHolder: ClothingListAdapterKt.ViewHolder, position: Int) {


    val currentClothing: Clothing = dataSetFiltered[position]

    // Get element from your dataset at this position and replace the
    // contents of the view with that element
    
    //SETTING MY VIEWS, ONLY COMMENTED OUT FOR THIS QUESTION

    }

    setAnimation(viewHolder.itemView, position);
}

override fun getFilter(): Filter {
    return object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults? {

            val charString: String = constraint.toString()

            
            if (charString.isEmpty()) {
                dataSetFiltered.addAll(dataSet)
            } else {
                val dataSetTemp: MutableList<Clothing> = mutableListOf()
                for (row in dataSet) {

                    
                    if (row.name.lowercase().contains(charString.lowercase())) {
                        dataSetTemp.add(row)
                    }
                    
                }
                dataSetFiltered = dataSetTemp
            }
            val filterResults = FilterResults()
            filterResults.values = dataSetFiltered
            return filterResults
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            dataSetFiltered = results?.values as MutableList<Clothing>
            notifyDataSetChanged()
        }
    }
}

适配器初始化

recylcerViewClothing.adapter = ClothingListAdapterKt(clothing, listener, this.requireContext())

这就是我所说的过滤器

adapter.filter.filter(searchTerm)    //searchTerm is a String passed by the constructor of the function it sits in

【问题讨论】:

    标签: android kotlin android-recyclerview filtering android-filter


    【解决方案1】:

    这是我的过滤器,它可以正常工作

    private val filter = object : Filter() {
        override fun performFiltering(constraint: CharSequence?): FilterResults {
            val result = FilterResults()
            val suggestions: MutableList<ShopAddressProvince> = mutableListOf()
    
            if (constraint != null) {
                suggestions.clear()
                val filterPattern = constraint.toString().lowercase()
                for (item in list) {
                    if (item.text.lowercase().contains(filterPattern)) {
                        suggestions.add(item)
                    }
                }
                result.values = suggestions
                result.count = suggestions.size
            }
    
            return result
        }
    

    并检查发布结果

    override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            clear()
            if (results != null && results.count > 0) {
                addAll(results.values as MutableList<ShopAddressProvince>)
            } else {
                addAll(list)
            }
            notifyDataSetChanged()
        }
    

    【讨论】:

    • 我也不会过滤,很遗憾。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多