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

时间:2019-03-29 12:54:55

标签: 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>

我要替换

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如果在渲染前已经列出,则会获取值,渲染后不会获取/更新值。所以我该怎么办?

1 个答案:

答案 0 :(得分:1)

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

使用observe()方法将Observer对象附加到LiveData对象。 watch()方法采用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
  }
}