将其值设置为“"后,无法过滤AutoCompleteTextView. [英] Unable to filter AutoCompleteTextView after settings it's value to ""
问题描述
我的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()
}
}
}
}
}
因此,一旦我开始过滤或选择显示的项之一,一切正常,但是一旦我取消了输入值,由于fornitori设置为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屋!