Как инициализировать счетчик, используя привязку данных - PullRequest
2 голосов
/ 03 июля 2019

Я использую привязку данных для привязки моего счетчика. Все работает хорошо, за исключением того, что при первой загрузке данных с сервера я инициализирую счетчик и устанавливаю выбранное значение из моей модели представления, но это не работает, если я закрываюи снова открыв страницу, я нахожу значение, выбранное в счетчике

Вот мой счетчик 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 не работает и при первой загрузке прядильщик не имеет выбранного значения

...