簡體   English   中英

將其值設置為“”后無法過濾 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 因此,您實際上應該將filteredList復制到fornitori中,而不是僅僅重新分配變量。


Kotlin 實際上沒有列表的副本 function,但在我看來,這樣的事情是最清楚的:

filteredList.clear()
filteredList.addAll(fornitori)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM