即使选择选项后,自动完成文本视图建议选项也会出现

问题描述 投票:0回答:2

我有一个自动完成文本视图,我正在做的是,在输入至少三个字符后,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,但没有任何效果

android kotlin drop-down-menu retrofit2 autocompletetextview
2个回答
0
投票

afterTextChanged 方法调用 viewmodel 方法,每当调用成功时,您都会更改“binding.etSpecialization”,以便代码再次进入 afterTextChanged 方法。这就是为什么你会一次又一次地收到建议。

当代码进入afterTextChanged方法时,应尽量不要再次调用afterTextChanged方法或避免再次调用服务。

也许您可以在

binding.etSpecialization.removeTextChangedListener()
的第一行使用
is NetworkResponseHandler.Success ->{
并在成功案例的最后几行使用
binding.etSpecialization.addTextChangedListener()


0
投票

您可以使用下面的代码来关闭 AutoCompleteTextView。

例如:yourAutoCompleteTextView.dismissDropDown();

© www.soinside.com 2019 - 2024. All rights reserved.