I have a problem with my personal adapter. When I search through the Observer pattern for information in a local database, it brings me the records but the adaptare is not called until you make a second attempt to delete and add the same petra to search. If I change the letter I have to delete it and re-enter it a second time so that it shows the help as you see in the image.
If you could help me I would appreciate it.
First search
second search. I delete the letter and enter it again
as you can see, now it works correctly.
I don't understood why.
Function call observer:
fun searchCountry(cadena:String){
var chain_1 = ""
if(cadena.trim().isNullOrEmpty()){
chain_1 = ""
}else{
chain_1 = cadena.trim() + "%"
}
locationViewModel.locationSearch(chain_1)
locationViewModel.locations.observe(this, Observer { locationList ->
autoCompleteTextView.setAdapter(LocationAdapter(this,locationList as List<Location>))
})
}
VieModel:
@HiltViewModel
class LocationViewModel @Inject constructor(private val getLocationUserCase: GetLocationUseCase) : ViewModel() {
val locations = MutableLiveData<List<Location?>>()
fun locationSearch(chain:String){
viewModelScope.launch {
val locationLst: List<Location> = getLocationUserCase(chain)
if(!locationLst?.isNullOrEmpty()){
locations.postValue(locationLst)
}else{
}
}
}
}
Adapter:
class LocationAdapter(context: Context, locations: List<Location>) : ArrayAdapter<Location>(context, 0, locations) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.account_frg_user_create_location_items, parent, false)
getItem(position)?.let { location ->
view.findViewById<TextView>(R.id.txtCountry).apply {
text = location.nom_municipio
}
view.findViewById<TextView>(R.id.txtProvince).apply {
text = location.nom_provincia
}
}
return view
}
}
XML-adapter:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:maxHeight="56dp"
android:padding="16dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtCountry"
android:layout_width="match_parent"
android:layout_weight="1"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
android:layout_height="wrap_content"
tools:text="Pueblo" />
<TextView
android:id="@+id/txtProvince"
android:layout_width="match_parent"
android:layout_weight="1"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2"
android:gravity="end"
android:layout_height="wrap_content"
tools:text="Provincia" />
</LinearLayout>
XML-Autocomepletetextview:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:completionThreshold="1"
android:imeOptions="actionDone"
android:inputType="text"
/>
</LinearLayout>
It is expected that when I enter a letter for the first time, it will show the search help that does show if I delete and add the same letter again or enter two letters or more.
Finally, I found my mistake. What happened is that the component, AutoCompleteTextView, already performed the same function that it was doing with the addTextChangedListener, so it searched for the information on both sides. Finally, the solution is to remove the addTextChangedListener, and pass the complete list to the adapter, since it is the autocomplete that is in charge of carrying out the search that it did on the database.
fun iniciacilarBd(){
locationViewModel.locationSearch("%")
// <!-- BASE_DE_DATOS
locationViewModel.locations.observe(this, Observer { locationList ->
locations = locationList
LocationAdapter(this,locations).also { locationAdapter ->
autoCompleteTextView.setAdapter(locationAdapter)
}
})
}
Thanks for the help
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.