将其值设置为“”后无法过滤 AutoCompleteTextView
Posted
技术标签:
【中文标题】将其值设置为“”后无法过滤 AutoCompleteTextView【英文标题】:Unable to filter AutoCompleteTextView after settings it's value to "" 【发布时间】:2021-06-07 13:56:01 【问题描述】:我的 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()
所以一旦我开始过滤或选择显示的项目之一,一切正常,但一旦我取消输入值,我就无法从自动完成中获取任何值,因为 fornitori 设置为 null,就像它的列表已被清除但我实际上只清除了过滤后的列表..
【问题讨论】:
正如我刚刚注意到的问题是当我在 else 语句中设置了 filtersLIst = fornitori 时,但我直到现在都无法解决它,因为我会再次将原始列表传递给它 【参考方案1】:问题出在你的第一个设置
filteredList = fornitori
然后调用
filteredList.clear()
由于您已将filteredList
设置为引用fornitori
,然后通过清除filteredList
,您也清除了fornitori
。因此,您实际上应该将fornitori
复制到filteredList
中,而不是仅仅重新分配变量。
Kotlin 实际上并没有列表的复制功能,但我认为像这样的东西是最清楚的:
filteredList.clear()
filteredList.addAll(fornitori)
【讨论】:
你从来没有设置filteredList = fornitori
?
问题是为了测试,我在 init 中删除了 `= mutableListOf()`,因此它通过设置它并通过执行 .clear()
和 .addAll
来引用 fornitori应该的以上是关于将其值设置为“”后无法过滤 AutoCompleteTextView的主要内容,如果未能解决你的问题,请参考以下文章
[转载]误将SELINUXTYPE看成SELINUX后,将其值改为disabled。导致操作系统服务启动,无法进入单用户模式
怎么将checkbox,radio,select控件设置为只读,不可选
如何修复 flutter_google_places_autocomplete.dart 的错误?