将其值设置为“”后无法过滤 AutoCompleteTextView
Unable to filter AutoCompleteTextView after settings it's value to ""
我的 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,就像它的列表一样已被清除但我实际上只清除了过滤后的列表..
问题出在你第一次设置
filteredList = fornitori
然后调用
filteredList.clear()
因为您已将 filteredList
设置为引用 fornitori
,然后通过清除 filteredList
您也清除了 fornitori
。因此,不只是重新分配变量,您实际上应该将 fornitori
复制到 filteredList
.
Kotlin 其实并没有列表的复制功能,不过我觉得最清楚的是:
filteredList.clear()
filteredList.addAll(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()
}
}
}
}
}
因此,一旦我开始过滤或选择显示的项目之一,一切正常,但一旦我取消输入值,我就无法从自动完成中获取任何值,因为 fornitori 设置为 null,就像它的列表一样已被清除但我实际上只清除了过滤后的列表..
问题出在你第一次设置
filteredList = fornitori
然后调用
filteredList.clear()
因为您已将 filteredList
设置为引用 fornitori
,然后通过清除 filteredList
您也清除了 fornitori
。因此,不只是重新分配变量,您实际上应该将 fornitori
复制到 filteredList
.
Kotlin 其实并没有列表的复制功能,不过我觉得最清楚的是:
filteredList.clear()
filteredList.addAll(fornitori)