Как динамически обновлять элементы spinner с помощью привязки к данным

#android #spinner #android-databinding

#Android #счетчик #android-привязка данных

Вопрос:

Я применяю пользовательский счетчик, используя привязку данных. Ранее я передавал массив из массива строк ресурсов, теперь я извлекаю данные с сервера, и мне нужно поместить этот массив в счетчик, так как я могу сделать это динамически? Как и здесь, я использую Android: проблема с атрибутом entries: Как я могу обновить значения моего счетчика, когда я извлекаю данные из API?

   <data>

    <variable
        name="model"
        type="com.abc.online.viewmodels.StoreHomeViewModel" />
</data>
<Spinner
                android:id="@ id/isspSelectCity"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:entries="@array/country_code_list"
                android:gravity="center"
                android:onItemSelected="@{(parent,view,pos,id)->model.onCitySelectItem(parent,view,pos,id)}" />
        </LinearLayout>
  

Я заменяю

 android:entries="@array/country_code_list"
  

с помощью

 android:entries="@{model.fetchCountriesCode()}"
  

Вот функция для получения городов

     public List<String> fetchCountriesCode(){
    List<String> list=new ArrayList<>();
    if (getCitiesObj().getValue()!=null) {
        Result[] cities = getCitiesObj().getValue().get(0).getResult();
        for (Result cit : cities) {
            list.add(cit.getName());
        }
    } return list;}
  

android: записи принимают значения, если у нас уже есть список перед рендерингом, он не принимает / обновляет значения после рендеринга. итак, как я могу это сделать?

Ответ №1:

Я предпочитаю использовать LiveData. Из документа: Создайте экземпляр LiveData для хранения определенного типа данных. Обычно это делается в вашем классе ViewModel. Создайте объект Observer, который определяет метод OnChanged(), который управляет тем, что происходит при изменении хранимых данных объекта LiveData. Обычно вы создаете объект Observer в контроллере пользовательского интерфейса, такой как activity или fragment.

Присоедините объект Observer к объекту LiveData с помощью метода observe(). Метод observe() принимает объект LifecycleOwner. Это подписывает объект Observer на объект LiveData, чтобы он уведомлялся об изменениях. Обычно вы прикрепляете объект Observer к контроллеру пользовательского интерфейса, например, к activity или fragment.

Когда вы обновляете значение, хранящееся в объекте LiveData, оно запускает всех зарегистрированных наблюдателей, пока подключенный LifecycleOwner находится в активном состоянии.

LiveData позволяет наблюдателям пользовательского интерфейса подписываться на обновления. Когда данные, хранящиеся в объекте LiveData, изменяются, пользовательский интерфейс автоматически обновляется в ответ.

     class Foo : ViewModel() {
  ...
  private val mSpinnerData = MutableLiveData<List<String>>()
  ...
  fun fetchSpinnerItems(): LiveData<List<String>> {
    //fetch data
    mSpinnerData.value = <some fetched list of Strings>
    return mSpinnerData
  }
}