简体   繁体   English

将其值设置为“”后无法过滤 AutoCompleteTextView

[英]Unable to filter AutoCompleteTextView after settings it's value to “”

I have an AutoCompleteTextView in my Android App, i have made a custom Adapter for it's layout and it's filter.我的 Android 应用程序中有一个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.问题是过滤器工作正常,直到我取消我在AutoCompleteTextView中写入的所有内容,一旦我清除它,构造函数中的列表变为空并且没有任何要过滤的项目,并且只有当我清空输入值时才会发生。

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

    }

}

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..因此,一旦我开始过滤或选择显示的项目之一,一切正常,但是一旦我取消输入值,我将无法从自动完成中获取任何值,因为 fornitori 设置为 null,就像它的列表已被清除但我实际上仅清除过滤列表..

The issue comes from you first setting问题来自您的第一个设置

filteredList = fornitori

and then calling然后打电话

filteredList.clear()

As you have set filteredList to refer to fornitori then by clearing filteredList you are also clearing fornitori .由于您已将filteredList列表设置为引用fornitori ,然后通过清除filteredList列表您也清除fornitori So instead of just reassigning the variable, you should actually copy fornitori into filteredList .因此,您实际上应该将filteredList复制到fornitori中,而不是仅仅重新分配变量。


Kotlin actually doesn't have a copy function for lists, but something like this is the most clear in my opinion: Kotlin 实际上没有列表的副本 function,但在我看来,这样的事情是最清楚的:

filteredList.clear()
filteredList.addAll(fornitori)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM