我正在使用数据绑定应用自定义微调器。我以前是从资源字符串数组传递数组的,现在我是从服务器获取数据的,我需要将该数组放到微调器中,那么我该如何动态地进行处理呢?像这里我正在使用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如果在渲染前已经列出,则会获取值,渲染后不会获取/更新值。所以我该怎么办?
答案 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
}
}