I try to use AutoCompleteTextView
with ArrayAdapter
. everything works correctly before first try to use AutoCompleteTextView
. after the first try, just AutoCompleteTextView
shows the last selection (and in this case your first try with AutoCompleteView
). I think with clear()
and notifyDataSetChanged()
must be ok but after clear()
and notifyDataSetChanged()
still I have problem. I search for the same question and everything was same but still have problem
this is my adapter:
class CityAutoCompleteAdapter(
context: Context,
cityList: ArrayList<CityModel>
) : ArrayAdapter<CityModel>(context, 0, cityList) {
var cityListFull: ArrayList<CityModel> = cityList
private var cityFilter: Filter = object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val results = FilterResults()
val suggestions: ArrayList<CityModel> = arrayListOf()
if (constraint == null || constraint.isEmpty()) {
suggestions.addAll(cityListFull)
} else {
val filterPattern: String = constraint.toString().toLowerCase().trim()
for (item in cityListFull) {
if (item.cityName.toLowerCase().contains(filterPattern)) {
suggestions.add(item)
}
}
}
results.values = suggestions
results.count = suggestions.size
return results
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
if (results != null) {
//@Suppress("UNCHECKED_CAST")
addAll(results.values as? List<CityModel> ?: cityListFull)
notifyDataSetChanged()
}
}
override fun convertResultToString(resultValue: Any?): CharSequence {
val result = resultValue as CityModel
return result.cityName
}
}
override fun getFilter(): Filter {
return cityFilter
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var newConvertView = convertView
if (convertView == null) {
newConvertView = LayoutInflater.from(context).inflate(
R.layout.simple_auto_complete_item, parent, false
)
}
val txtAutoCompleteCityName: TextView =
newConvertView?.findViewById(R.id.txtAutoCompleteLabel) ?: TextView(context)
val cityItem: CityModel? = getItem(position)
if (cityItem != null) {
txtAutoCompleteCityName.text = cityItem.cityName
}
return newConvertView!!
}
}
and this is my class where I used AutoCompleteView:
cityAdapter = result.success()?.let {
CityAutoCompleteAdapter(
requireContext(),
it
)
}
binding.layoutFragmentPickupSender.layoutBottomSheetSender.autoAddSenderStateCity.setAdapter(cityAdapter)
cityAdapter?.notifyDataSetChanged()
binding.layoutFragmentPickupSender.layoutBottomSheetSender.autoAddSenderStateCity.onItemClickListener =
OnItemClickListener { adapterView, view, pos, id -> //this is the way to find selected object/item
selectedCity = adapterView.getItemAtPosition(pos) as CityModel
cityAdapter?.notifyDataSetChanged()
}
may please guide me where I make a mistake?