#android #spinner #android-databinding
#Android #счетчик #android-привязка данных
Вопрос:
Я применяю пользовательский счетчик, используя привязку данных. Ранее я передавал массив из массива строк ресурсов, теперь я извлекаю данные с сервера, и мне нужно поместить этот массив в счетчик, так как я могу сделать это динамически? Как и здесь, я использую 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: записи принимают значения, если у нас уже есть список перед рендерингом, он не принимает / обновляет значения после рендеринга. итак, как я могу это сделать?
Ответ №1:
Я предпочитаю использовать LiveData. Из документа: Создайте экземпляр LiveData для хранения определенного типа данных. Обычно это делается в вашем классе ViewModel. Создайте объект Observer, который определяет метод OnChanged(), который управляет тем, что происходит при изменении хранимых данных объекта LiveData. Обычно вы создаете объект Observer в контроллере пользовательского интерфейса, такой как activity или fragment.
Присоедините объект Observer к объекту LiveData с помощью метода observe(). Метод observe() принимает объект LifecycleOwner. Это подписывает объект Observer на объект LiveData, чтобы он уведомлялся об изменениях. Обычно вы прикрепляете объект Observer к контроллеру пользовательского интерфейса, например, к activity или fragment.
Когда вы обновляете значение, хранящееся в объекте LiveData, оно запускает всех зарегистрированных наблюдателей, пока подключенный LifecycleOwner находится в активном состоянии.
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
}
}