如何使用数据绑定动态更新微调项

How to update spinner items dynamically using databinding

我正在使用数据绑定应用自定义微调器。我以前从资源字符串数组传递数组,现在我从服务器获取数据,我需要将该数组放到微调器中,那么我如何才能动态地做到这一点?就像这里我使用的是 android:entries 属性 Issue:How 如果从 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:entries 如果我们在渲染前已经列出了值,它不会在渲染后 take/update 值。那么我该怎么做呢?

我更喜欢使用 LiveData。从文件: 创建一个 LiveData 实例来保存某种类型的数据。这通常在您的 ViewModel class 中完成。 创建一个定义 onChanged() 方法的 Observer 对象,该方法控制当 LiveData 对象的保存数据发生变化时发生的情况。您通常在 UI 控制器中创建观察者对象,例如 activity 或片段。

使用 observe() 方法将 Observer 对象附加到 LiveData 对象。 observe() 方法接受一个 LifecycleOwner 对象。这会将 Observer 对象订阅到 LiveData 对象,以便它收到更改通知。您通常将 Observer 对象附加到 UI 控制器中,例如 activity 或片段。

当您更新存储在 LiveData 对象中的值时,只要附加的 LifecycleOwner 处于活动状态,它就会触发所有已注册的观察者。

LiveData 允许 UI 控制器观察者订阅更新。当 LiveData 对象保存的数据发生变化时,UI 会自动更新以响应。

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