【问题标题】:Unable to filter AutoCompleteTextView after settings it's value to ""将其值设置为“”后无法过滤 AutoCompleteTextView
【发布时间】: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 时,但我直到现在都无法解决它,因为我会再次将原始列表传递给它

标签: android kotlin android-filterable


【解决方案1】:

问题出在你的第一个设置

filteredList = fornitori

然后调用

filteredList.clear()

由于您已将filteredList 设置为引用fornitori,然后通过清除filteredList,您也清除了fornitori。因此,您实际上应该将fornitori 复制到filteredList 中,而不是仅仅重新分配变量。


Kotlin 实际上并没有列表的复制功能,但我认为像这样的东西是最清楚的:

filteredList.clear()
filteredList.addAll(fornitori)

【讨论】:

  • 你从来没有设置filteredList = fornitori
  • 问题是为了测试,我在 init 中删除了 `= mutableListOf()`,因此它通过设置它并通过执行 .clear().addAll 来引用 fornitori应该的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多