将其值设置为“"后,无法过滤AutoCompleteTextView. [英] Unable to filter AutoCompleteTextView after settings it's value to ""

查看:90
本文介绍了将其值设置为“"后,无法过滤AutoCompleteTextView.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an AutoCompleteTextView in my Android App, i have made a custom Adapter for it's layout and it's filter.

问题是,过滤器可以正常工作,直到我取消所有在 AutoCompleteTextView 中编写的内容,一旦将其清除,构造函数的列表将变为空,并且没有任何要过滤的项目,并且仅当我清空输入值时才会发生.

The issue is that the filter works fine till i cancel all i write in the AutoCompleteTextView, once i clear it the list from the constructor become empty and there isn't any item to filter and it's happen only when i empty the input value.

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

By default when the input is empty i would show the whole list of items the user can choose.

这是我的自定义适配器:

Here is my custom Adapter:

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()
                }
            }
        }

    }

}

因此,一旦我开始过滤或选择显示的项之一,一切正常,但是一旦我取消了输入值,由于f​​ornitori设置为null,就无法从自动完成中获取任何值,就像它的列表已被清除一样但我实际上只清除了过滤列表.

So once i start to filter or choose one of the shown items all works okay, but once i cancel the input value i'm unable to get any value from autocomplete as fornitori is set to null, like it's list has been cleared but i actually clear only the filtered list..

推荐答案

问题来自于您的首次设置

The issue comes from you first setting

filteredList = fornitori

然后致电

filteredList.clear()

由于您已将 filteredList 设置为引用 fornitori ,然后通过清除 filteredList 来清除 fornitori .因此,您不仅应该重新分配变量,还应该将 fornitori 复制到 filteredList 中.

As you have set filteredList to refer to fornitori then by clearing filteredList you are also clearing fornitori. So instead of just reassigning the variable, you should actually copy fornitori into filteredList.

Kotlin实际上没有列表的复制功能,但是在我看来,这样的事情是最清楚的:

Kotlin actually doesn't have a copy function for lists, but something like this is the most clear in my opinion:

filteredList.clear()
filteredList.addAll(fornitori)

这篇关于将其值设置为“"后,无法过滤AutoCompleteTextView.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆