我有一个自动完成文本视图,我正在做的是,在输入至少三个字符后,API 将调用,并且我从 api 中获取一个列表,我将其用作建议,但问题是在选择选项后,建议弹出一次又一次地出现,我该如何阻止?
binding.etSpecialization.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
Log.d(Constants.DoctorTag, "inside specialities funtion")
if (!s.isNullOrBlank()){
try {
val specialities=s.toString()
Log.d(Constants.DoctorTag, "value send--$specialities")
specializationViewModel.getSpecialities(specialities)
}catch (e: Exception) {
// Handle the case where the input is not a valid integer
Log.e(Constants.DoctorTag, "Invalid pincode: $e")
}
}
}
})
这里我调用api并且
specializationViewModel.specialities.observe(this){
when(it){
is NetworkResponseHandler.Success ->{
val SpecialitiesList=it.data?.data
Log.d(Constants.DoctorTag, "This is specialities list ------${SpecialitiesList}")
Log.d(Constants.DoctorTag, "This is specialities total list ------${it.data?.total}")
try {
if (SpecialitiesList!=null){
Log.d(Constants.DoctorTag, "list is not null")
specialitiesAdapter= SpecialitiesAdapter(this,SpecialitiesList)
binding.etSpecialization.setAdapter(specialitiesAdapter)
binding.etSpecialization.showDropDown()
binding.etSpecialization.threshold=1
binding.etSpecialization.setOnItemClickListener { _, _, position, _ ->
val selcetedSpecialities=specialitiesAdapter.getItem(position)
if (selcetedSpecialities!=null){
val specialities=selcetedSpecialities.title
binding.etSpecialization.setText(specialities)
specialtyId=selcetedSpecialities.id
binding.etSpecialization.clearFocus()
binding.etSpecialization.dismissDropDown()
}
else {
Toast.makeText(this
, "null value ", Toast.LENGTH_LONG).show()
binding.etSpecialization.clearFocus()
}
}
}
else{
Log.d(Constants.DoctorTag, "Specialities list is null------")
Toast.makeText(this,"Specialities not found",Toast.LENGTH_LONG).show()
}
}catch (e:Exception){
Log.d(Constants.DoctorTag, "specialities list exception---$e")
}
}
is NetworkResponseHandler.Error ->{
Log.d(Constants.DoctorTag, "pincodes list ${it.massage}")
}
is NetworkResponseHandler.Loading ->{
Log.d(Constants.DoctorTag, "pincodes list loading ${it.massage}")
}
}
}
这里我正在处理响应,我也使用了clearfocus()和dismissdropdown,但没有任何效果
afterTextChanged 方法调用 viewmodel 方法,每当调用成功时,您都会更改“binding.etSpecialization”,以便代码再次进入 afterTextChanged 方法。这就是为什么你会一次又一次地收到建议。
当代码进入afterTextChanged方法时,应尽量不要再次调用afterTextChanged方法或避免再次调用服务。
也许您可以在
binding.etSpecialization.removeTextChangedListener()
的第一行使用 is NetworkResponseHandler.Success ->{
并在成功案例的最后几行使用 binding.etSpecialization.addTextChangedListener()
您可以使用下面的代码来关闭 AutoCompleteTextView。
例如:yourAutoCompleteTextView.dismissDropDown();