How to add a custom adapter to an AutoCompleteTextView

前端 未结 6 1115
感情败类
感情败类 2021-02-14 08:35

Is there any simple way to set a 2 TextView dropdown to an AutoCompleteTextView.

There is android.R.layout.two_line_list_item Which I couldn\'t find any exa

6条回答
  •  爱一瞬间的悲伤
    2021-02-14 09:20

    Converted Dwivedi Ji's answer to Kotlin. I had some issue with Android Studio's auto convert. Thus, spent some time to make it work.

    Now it is working. In case anyone needs it (in my case, I am filtering street names):

    class StreetsAdapter( private val mContext: Context,
                          private val viewResourceId: Int,
                          private val items: ArrayList) : ArrayAdapter(mContext, viewResourceId, items.toList()) {
    
        private val itemsAll = items.clone() as ArrayList
        private var suggestions = ArrayList()
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            var v: View? = convertView
            if (v == null) {
                val vi = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
                v = vi.inflate(viewResourceId, null)
            }
            val street: Street? = items[position]
            if (street != null) {
                val streetTitle = v?.findViewById(R.id.tvStreetTitle) as TextView?
                streetTitle?.text = street.title
            }
            return v!!
        }
    
        override fun getFilter(): Filter {
            return nameFilter
        }
    
        private var nameFilter: Filter = object : Filter() {
            override fun convertResultToString(resultValue: Any): String {
                return (resultValue as Street).title
            }
    
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                return if (constraint != null) {
                    suggestions.clear()
                    for (street in itemsAll) {
                        if (street.title.toLowerCase().startsWith(constraint.toString().toLowerCase())) {
                            suggestions.add(street)
                        }
                    }
                    val filterResults = FilterResults()
                    filterResults.values = suggestions
                    filterResults.count = suggestions.size
                    filterResults
                } else {
                    FilterResults()
                }
            }
    
            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                val filteredList =  results?.values as ArrayList?
    
                if (results != null && results.count > 0) {
                    clear()
                    for (c: Street in filteredList ?: listOf()) {
                        add(c)
                    }
                    notifyDataSetChanged()
                }
            }
        }
    }
    
    

    And set your adapter:

    val adapter = StreetsAdapter(this,
           R.layout.item_street, //Your layout. Make sure it has [TextView] with id "tvStreetTitle" 
           arrayListOf() //Your list goes here
    )
    autoTextView.threshold = 1 //will start working from first character
    autoTextView.setAdapter(adapter)
    

提交回复
热议问题