J'utilise Android bibliothèque de liaison de données. Si je veux rendre une vue visible, je peux écrire quelque chose comme ceci:
<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}" />
Existe-t-il une option pour se lier à une propriété d'actualisation de swipeRefreshLayout d'une manière similaire (xml)?
Actuellement, je le mets en code en appelant setRefreshing (true/false) mais j'aimerais le faire en xml pour être cohérent.
MISE À JOUR: En tant que liaison de données mappe du nom d'attribut xml vers set{AttributeName}
, vous pouvez simplement utiliser app:refreshing
, car la liaison de données fournira avec succès la valeur à la méthode setRefreshing
de SwipeRefreshLayout
(qui heureusement pour nous existe et est publique):
<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>
C'est ça! Notez que vous pouvez simplement utiliser @{true}
ou @{false}
au lieu de @{habitListViewModel.isLoading}
. J'espère que cela pourra aider.
Pas besoin de pirater. La clé est de rechercher les méthodes publiques dans documentation SwipeRefreshLayout . En général, la liaison de données recherchera le nom correspondant sans la partie set
. Par exemple. vous y trouverez:
L'OnRefreshListener
Étant donné que OnRefreshListener est une interface publique, avec une seule méthode, vous pouvez directement l'utiliser dans votre liaison, comme ceci:
app:onRefreshListener="@{() -> viewModel.onRefresh()}"
Mise à jour de l'état
Pour celui-ci, vous utilisez l'autre méthode publique, qui se traduit par:
app:refreshing="@{viewModel.isLoading}"
Dans l'ensemble, cela peut ressembler à ceci:
<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>
modèle de vue:
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);
}
}
Utilisez simplement cette app:refreshing="@{booleanValueHere}"
. La liaison de données détectera automatiquement la référence à la fonction isRefreshing.