Как установить свойство обновления SwipeRefreshLayout с помощью привязки данных android?
Я использую библиотеку привязки данных android. Если я хочу сделать видимым, я могу написать что-то вроде этого:
<TextView
android:id="@+id/label_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{habitListViewModel.message}"
app:visibility="@{habitListViewModel.hasError ? View.VISIBLE : View.GONE}" />
есть ли возможность привязать к свойству refresh свойства swipeRefreshLayout аналогичным образом (xml)?
В настоящее время я устанавливаю его в коде, вызывая setRefreshing(true/false), но хотел бы сделать его в xml согласованным.
4 ответов
обновление:
Как привязка данных сопоставляет имя атрибута xml с set{AttributeName}
, вы можете просто использовать app:refreshing
, поскольку привязка данных успешно предоставит значение setRefreshing
метод SwipeRefreshLayout
(который, к счастью для нас существует и общественные):
<android.support.v4.widget.SwipeRefreshLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:refreshing="@{habitListViewModel.isLoading}">
...
//ListView,RecyclerView or something
</android.support.v4.widget.SwipeRefreshLayout>
вот именно! Обратите внимание, что вы можете просто использовать @{true}
или @{false}
вместо @{habitListViewModel.isLoading}
. Надеюсь, это поможет.
нет необходимости взломать. Ключ искать общедоступных методов в документация SwipeRefreshLayout. В общем случае Databinding будет искать соответствующее имя без set
часть. Е. Г. вы найдете здесь:
- setOnRefreshListener (SwipeRefreshLayout.OnRefreshListener слушателя)
- setRefreshing (логическое обновление)
в OnRefreshListener
поскольку OnRefreshListener является открытым интерфейсом, с помощью одного метода вы можете напрямую использовать это в своей привязке, например:
app:onRefreshListener="@{() -> viewModel.onRefresh()}"
обновление статуса
для этого вы используете другой открытый метод, который переводится как:
app:refreshing="@{viewModel.isLoading}"
все вместе, это может выглядеть так:
<data>
<variable name="viewModel" type="ViewModel" />
</data>
<android.support.v4.widget.SwipeRefreshLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:refreshing="@{viewModel.isLoading}"
app:onRefreshListener="@{() -> viewModel.onRefresh()}">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
viewmodel:
public class ViewModel implements DataProvider.Callback {
public ObservableBoolean isLoading = new ObservableBoolean();
private DataProvider provider;
MasterViewModel(@NonNull final DataProvider provider) {
this.provider = provider;
}
/* Needs to be public for Databinding */
public void onRefresh() {
isLoading.set(true);
provider.fetch(this);
}
public void onReady(List results){
isLoading.set(false);
}
public void onError(Exception oops){
isLoading.set(false);
Log.e("Stack", oops);
}
}
просто использовать app:refreshing="@{booleanValueHere}"
. Привязка данных автоматически определит ссылку на функцию isRefreshing.
у меня недостаточно репутации, чтобы комментировать, поэтому я дополню ответы здесь.
@Entreco прав, нет необходимости использовать attrs.XML.
Я просто хочу указать, что не работает для меня, потому что у моей ViewModel было свойство ObservableField<Boolean>
.
когда я изменил это на ObservableBoolean
(как в Примере Entreco - спасибо за это) это сработало. Не знаю, почему, хотя.