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

M.A*_*han 0 android spinner android-databinding

我正在使用数据绑定应用自定义微调器。我以前从资源字符串数组传递数组,现在我从服务器获取数据,我需要将该数组放入微调器,那么我如何动态地做到这一点?就像这里我使用 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>
Run Code Online (Sandbox Code Playgroud)

我正在更换

android:entries="@array/country_code_list"
Run Code Online (Sandbox Code Playgroud)

android:entries="@{model.fetchCountriesCode()}"
Run Code Online (Sandbox Code Playgroud)

这是获取城市的功能

    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;}
Run Code Online (Sandbox Code Playgroud)

android:entries 如果我们在渲染之前已经列出了值,则它不会在渲染后采用/更新值。那么我该怎么做呢?

Ami*_*ari 7

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

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

当您更新 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
  }
}
Run Code Online (Sandbox Code Playgroud)