Как динамически обновлять элементы блесны с помощью привязки данных - PullRequest
0 голосов
/ 29 марта 2019

Я применяю пользовательский спиннер, используя привязку данных.Ранее я передавал массив из массива строк ресурсов, теперь я получаю данные с сервера, и мне нужно поместить этот массив в счетчик, так как я могу сделать это динамически?Как и здесь, я использую атрибут android: records. Проблема: Как обновить значения счетчика, если при извлечении данных из 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 Ответ

2 голосов
/ 29 марта 2019

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

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

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

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
  }
}
...