在 AutoCompleteTextView 适配器中选择了错误的项目

时间:2021-06-16 10:07:56

标签: android kotlin autocompletetextview

我在 AutoCompleteTextView 适配器中遇到问题。我必须创建自动完成适配器,它将显示设备中过滤后的联系人列表。就我而言,过滤工作正常。但是当我从列表中选择一项时,AutoCompleteTextView 中的数据集来自原始列表,而不是过滤后的列表。谁能帮我解决这个问题?< /p>

请在下面找到我的适配器类

class ContactListAdapter(private var ctx: Context, private var contacts: ArrayList<MobileContact>):
    ArrayAdapter<MobileContact>(ctx, R.layout.contact_item, contacts) {

    private var filter: ContactFilter? = null

    private class ViewHolder(view: View?) {
        var name: TextView? = null
        var number: TextView? = null

        init {
            name = view?.findViewById(R.id.contactName)
            number = view?.findViewById(R.id.contactNumber)
        }
    }

    private val filteredContacts = ArrayList<MobileContact>()

    override fun getCount() = filteredContacts.size

    override fun getFilter(): Filter {
        return if(filter == null)
            ContactFilter(this, contacts)
        else filter!!
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view: View
        val viewHolder: ViewHolder
        val contact = filteredContacts[position]

        val inflater = ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        if(convertView == null) {
            view = inflater.inflate(R.layout.contact_item, parent, false)
            viewHolder = ViewHolder(view)
            view.tag = viewHolder
        } else {
            view = convertView
            viewHolder = view.tag as ViewHolder
        }

        viewHolder.name?.text = contact.name
        viewHolder.number?.text = contact.number

        return view
    }

    @Suppress("UNCHECKED_CAST")
    class ContactFilter(private var adapter: ContactListAdapter, private var contacts: ArrayList<MobileContact>) : Filter() {
        private var filteredContacts = ArrayList<MobileContact>()

        override fun performFiltering(constraint: CharSequence?): FilterResults {
            filteredContacts.clear()
            val results = FilterResults()
            if(constraint == null || constraint.isEmpty()) {
                filteredContacts.addAll(contacts)
            } else {
                val filterPattern = constraint.toString().toLowerCase(Locale.ENGLISH).trim()
                for(contact in contacts) {
                    if(contact.name.toLowerCase(Locale.ENGLISH).contains(filterPattern) ||
                            contact.number.contains(filterPattern)) {
                        filteredContacts.add(contact)
                    }
                }
            }
            results.values = filteredContacts
            results.count = filteredContacts.size
            return results
        }

        override fun convertResultToString(resultValue: Any?): CharSequence {
            return (resultValue as MobileContact).number
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            adapter.filteredContacts.clear()
            adapter.filteredContacts.addAll(results?.values as ArrayList<MobileContact>)
            adapter.notifyDataSetChanged()
        }
    }
}

1 个答案:

答案 0 :(得分:0)

经过大量调试后,我解决了这个问题。在这里,我所做的是从适配器中删除了过滤后的结果。并且过滤器将保留整个数据。

请在下面找到代码。有人可能有用

class ContactListAdapter(private var ctx: Context, private var contacts: ArrayList<MobileContact>):
    ArrayAdapter<MobileContact>(ctx, R.layout.contact_item, contacts) {

    private var filter = ContactFilter()

    private class ViewHolder(view: View?) {
        var name: TextView? = null
        var number: TextView? = null

        init {
            name = view?.findViewById(R.id.contactName)
            number = view?.findViewById(R.id.contactNumber)
        }
    }

    override fun getCount() = contacts.size

    override fun getFilter(): Filter {
        return filter
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view: View
        val viewHolder: ViewHolder
        val contact = contacts[position]

        val inflater = ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        if(convertView == null) {
            view = inflater.inflate(R.layout.contact_item, parent, false)
            viewHolder = ViewHolder(view)
            view.tag = viewHolder
        } else {
            view = convertView
            viewHolder = view.tag as ViewHolder
        }

        viewHolder.name?.text = contact.name
        viewHolder.number?.text = contact.number

        return view
    }

    @Suppress("UNCHECKED_CAST")
    inner class ContactFilter : Filter() {
        private var filteredContacts = ArrayList<MobileContact>()
        private var origList = ArrayList<MobileContact>()

        override fun performFiltering(constraint: CharSequence?): FilterResults {
            if(origList.isEmpty())
                origList.addAll(contacts)

            filteredContacts.clear()
            val results = FilterResults()
            if(constraint == null || constraint.isEmpty()) {
                filteredContacts.addAll(origList)
            } else {
                val filterPattern = constraint.toString().toLowerCase(Locale.ENGLISH).trim()
                for(contact in origList) {
                    if(contact.name.toLowerCase(Locale.ENGLISH).contains(filterPattern) ||
                            contact.number.contains(filterPattern)) {
                        filteredContacts.add(contact)
                    }
                }
            }
            results.values = filteredContacts
            results.count = filteredContacts.size
            return results
        }

        override fun convertResultToString(resultValue: Any?): CharSequence {
            return (resultValue as MobileContact).number
        }

        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
            contacts.clear()
            contacts.addAll(results?.values as ArrayList<MobileContact>)
            notifyDataSetChanged()
        }
    }
}