Я использую привязку данных для привязки моего счетчика. Все работает хорошо, за исключением того, что при первой загрузке данных с сервера я инициализирую счетчик и устанавливаю выбранное значение из моей модели представления, но это не работает, если я закрываюи снова открыв страницу, я нахожу значение, выбранное в счетчике
Вот мой счетчик xml:
<Spinner
android:id="@+id/construction_site"
android:layout_width="match_parent"
android:layout_height="40dp"
android:prompt="@string/select_existing_construction_site"
app:entries="@{viewModel.constructionSiteAdapter}"
app:selectedValue="@{viewModel.constructionSite}"
style="@style/Widget.AppCompat.DropDownItem.Spinner">
</Spinner>
В viewModel я инициализирую счетчик следующим образом:
class RightDrawerViewModel : ViewModel(){
val constructionSiteAdapter: ArrayAdapter<ConstructionSite> by lazy {
ConstructionSiteAdapter(
App.context,
R.layout.cell_construction_site_list_item,
ArrayList()
)
}
fun bind(constructionSite: ConstructionSite) {
constructionSiteAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
constructionSiteAdapter.clear()
this.constructionSite.value = constructionSite // here I set the selected site to the spinner using data binding
setConstructionSites(constructionSite)
loadConstructionSites() // this method, load all sites from server and add them to the spinner
}
}
Вот мой адаптер привязки:
@BindingAdapter(value = ["selectedValue", "selectedValueAttrChanged", "entries"], requireAll = false)
fun setEntries(view: Spinner, newSelectedValue: ConstructionSite?, bindingListener: InverseBindingListener?, adapter: ArrayAdapter<*>) {
view.adapter = adapter
view.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
bindingListener?.onChange()
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
if (newSelectedValue != null) {
val pos = (view.adapter as? ArrayAdapter<ConstructionSite>)?.getPosition(newSelectedValue)
if (pos != null) view.setSelection(pos, true)
}
}
@InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
fun getSelectedValue(view: Spinner): ConstructionSite {
return view.selectedItem as ConstructionSite
}
Итак, проблема в том, что this.constructionSite.value = constructionSite
не работает и при первой загрузке прядильщик не имеет выбранного значения