首页 > 解决方案 > 在过滤recyclerview列表中清除EditText不起作用

问题描述

这是我在 MainActivity 中过滤的代码

search!!.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
            override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
                adapter!!.filter.filter(charSequence.toString())           
            }
            override fun afterTextChanged(editable: Editable) {}
        })

这是我在适配器类中的代码

override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(constraint: CharSequence?): FilterResults {
        //new list for filtering
                newList.clear()
                val results = FilterResults()
                if (constraint.isNullOrBlank()) {
        //dataList is a list with data from mainActivity
                    newList!!.addAll(dataList!!)
                } else {
                    val filterPattern = constraint.toString().toLowerCase().trim { it <= ' ' }
                    for (item in dataList) {
                        if (item.sv_number.toString().toLowerCase().contains(filterPattern)) {
                            newList!!.add(item)
                        }
                    }
                }
                results.values = newList
                results.count = newList!!.size       
                return results
            }

            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                if (newList.isNullOrEmpty()) {
                    Log.d("there is nothing", "nothing")
                } else dataList.clear()
                dataList.addAll(newList)
                notifyDataSetChanged()
            }
        }
    }

过滤工作正常,如果我输入例如 123,它将过滤它。但是当我删除我输入的内容(123)时,它不会回到旧视图,所有数据,所以我可以再次搜索。仅显示带有过滤数据的新过滤视图。我在这里做错了什么?

标签: androidkotlinfilterfiltering

解决方案


我认为您正在使用 dataList 在回收站视图中显示列表。修改过滤dataList后问题出在这里。因此,当您删除搜索文本时,没有包含原始数据的列表可以将其加载回过滤后的元素。我建议创建一个包含原始数据的列表,比如 originalList。首先加载复制 this(originalList) 到 dataList。

修改你的代码

 if (constraint.isNullOrBlank()) {
    //originalList is a list with data from mainActivity
                newList!!.addAll(originalList!!)
            } else {
                val filterPattern = constraint.toString().toLowerCase().trim { it <= ' ' }
                for (item in originalList) {
                    if (item.sv_number.toString().toLowerCase().contains(filterPattern)) {
                        newList!!.add(item)
                    }
                }
            }

推荐阅读