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



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

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

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()
}
}
}

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

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

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()
}
}
}

最新更新