web-dev-qa-db-fra.com

Comment définir la propriété d'actualisation SwipeRefreshLayout en utilisant Android liaison de données?

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.

21
daneejela

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.

19
rom4ek

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);
    }
}
58
Entreco

Utilisez simplement cette app:refreshing="@{booleanValueHere}". La liaison de données détectera automatiquement la référence à la fonction isRefreshing.

1
Viven