Android 设置AutoCompleteTextView后无法对其进行筛选';s值为&引用;

Android 设置AutoCompleteTextView后无法对其进行筛选';s值为&引用;,android,kotlin,android-filterable,Android,Kotlin,Android Filterable,在我的Android应用程序中有一个AutoCompleteTextView,我为它的布局和过滤器制作了一个自定义适配器 问题是,在我取消在AutoCompleteTextView中写入的所有内容之前,过滤器工作正常,一旦我清除它,构造函数中的列表将变为空,并且没有任何要过滤的项,只有在我清空输入值时才会发生 默认情况下,当输入为空时,我将显示用户可以选择的项目的整个列表 这是我的自定义适配器: class FornitoriAdapter(context: Context, fornitori

在我的Android应用程序中有一个
AutoCompleteTextView
,我为它的布局和过滤器制作了一个自定义适配器

问题是,在我取消在
AutoCompleteTextView
中写入的所有内容之前,过滤器工作正常,一旦我清除它,构造函数中的列表将变为空,并且没有任何要过滤的项,只有在我清空输入值时才会发生

默认情况下,当输入为空时,我将显示用户可以选择的项目的整个列表

这是我的自定义适配器:

class FornitoriAdapter(context: Context, fornitori: MutableList<Fornitori> = mutableListOf(), resource: Int) :
    ArrayAdapter<Fornitori>(context, resource), Filterable {

    private var filteredList: MutableList<Fornitori> = mutableListOf()

    init {
        filteredList = fornitori.toMutableList()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val row: View
        val holder: ViewHolder

        if (convertView == null) {
            val inflater = LayoutInflater.from(context)
            row = inflater.inflate(R.layout.list_item, parent, false)
            holder = ViewHolder(row)
            row.tag = holder
        } else {
            row = convertView
            holder = row.tag as ViewHolder
        }

        val fornitore: Fornitori = filteredList[position]

        holder.descrText.text = fornitore.desc
        holder.codeText.text = fornitore.cod

        return row
    }

    override fun getCount(): Int {
        return filteredList.size
    }

    override fun getItem(position: Int): Fornitori {
        return filteredList[position]
    }

    private class ViewHolder constructor(row: View) {
        val descrText: TextView = row.findViewById(R.id.description)
        val codeText: TextView = row.findViewById(R.id.code)
    }

    override fun getFilter(): Filter {
        return customFilter
    }

    private val customFilter = object : Filter() {
        override fun convertResultToString(resultValue: Any?): CharSequence {
            return (resultValue as Fornitori).desc
        }

        override fun performFiltering(constraint: CharSequence?): FilterResults {
            return if (constraint != null) {
                filteredList.clear()
                fornitori.forEach { // HERE FORNITORI IF I EMPTY THE INPUT BECOME LENGTH 0
                    if (it.cod.equals(constraint.toString(), ignoreCase = true) || it.desc.toLowerCase(
                            Locale.ROOT
                        ).startsWith(
                            constraint.toString().toLowerCase(
                                Locale.ROOT
                            )
                        )
                    ) {
                        filteredList.add(it)
                    }
                }
                val filterResults = FilterResults()
                filterResults.values = filteredList
                filterResults.count = filteredList.size
                filterResults
            }else {
                filteredList.clear()
                filteredList = fornitori
                val filterResults = FilterResults()
                filterResults.values = filteredList
                filterResults.count = filteredList.size
                filterResults
            }
        }

        override fun publishResults(constraint: CharSequence?, filterResults: FilterResults) {
            val filterList = filterResults.values as? MutableList<*>
            if (filterResults.count > 0) {
                filterList?.forEach {
                    add(it as Fornitori)
                }.also {
                    notifyDataSetChanged()
                }
            }
        }

    }

}
类FornitoriAdapter(上下文:context,fornitori:MutableList=mutableListOf(),资源:Int):
ArrayAdapter(上下文、资源),可筛选{
私有变量filteredList:MutableList=mutableListOf()
初始化{
filteredList=fornitori.toMutableList()
}
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
val行:视图
val持有者:视图持有者
if(convertView==null){
val inflater=LayoutInflater.from(上下文)
行=充气机。充气(R.layout.list\u项,父项,false)
保持架=视图保持架(行)
row.tag=支架
}否则{
行=转换视图
holder=行。标记为ViewHolder
}
val fornitore:Fornitori=filteredList[位置]
holder.descrText.text=fornitore.desc
holder.codeText.text=fornitore.cod
返回行
}
重写fun getCount():Int{
返回filteredList.size
}
覆盖趣味getItem(位置:Int):Fornitori{
返回过滤器列表[位置]
}
私有类ViewHolder构造函数(行:视图){
val descrText:TextView=row.findViewById(R.id.description)
val codeText:TextView=row.findViewById(R.id.code)
}
重写getFilter():筛选器{
返回自定义筛选器
}
private val customFilter=对象:Filter(){
重写fun convertResultToString(resultValue:Any?):CharSequence{
返回(结果值为Fornitori).desc
}
重写fun performFiltering(约束:CharSequence?):FilterResults{
如果(约束!=null)返回{
filteredList.clear()
fornitori.forEach{//此处fornitori如果我清空输入,则长度变为0
if(it.cod.equals(constraint.toString(),ignoreCase=true)| | it.desc.toLowerCase(
Locale.ROOT
).startsWith(
constraint.toString().toLowerCase(
Locale.ROOT
)
)
) {
filteredList.add(它)
}
}
val filterResults=filterResults()
filterResults.values=filteredList
filterResults.count=filteredList.size
过滤结果
}否则{
filteredList.clear()
filteredList=fornitori
val filterResults=filterResults()
filterResults.values=filteredList
filterResults.count=filteredList.size
过滤结果
}
}
覆盖fun publishResults(约束:CharSequence?,filterResults:filterResults){
val filterList=filterResults.values as?可变列表
如果(filterResults.count>0){
过滤列表?forEach{
添加(作为Fornitori)
}.还有{
notifyDataSetChanged()
}
}
}
}
}

因此,一旦我开始筛选或选择显示的项目之一,所有工作正常,但一旦我取消输入值,我无法从autocomplete中获取任何值,因为fornitori设置为null,就像它的列表已被清除,但我实际上只清除筛选的列表。

问题来自您的第一个设置

filteredList = fornitori
然后打电话

filteredList.clear()
当您将
filteredList
设置为引用
fornitori
时,通过清除
filteredList
您也在清除
fornitori
。因此,您应该将
fornitori
复制到
filteredList
中,而不是仅仅重新分配变量


Kotlin实际上没有列表的复制功能,但在我看来,这样的功能最为明显:

filteredList.clear()
filteredList.addAll(fornitori)

正如我刚才注意到的,问题是当我在else station中设置filteredLIst=fornitori时,但我现在还无法解决它,因为我会再次将原始列表传递给它,而您从未设置过
filteredLIst=fornitori
?问题是,在测试时,我在init中删除了“=mutableListOf()”,因为它是在引用fornitori,通过设置它并执行
.clear()
.addAll
可以正常工作