Как установить свойство обновления 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 часть. Е. Г. вы найдете здесь:

в 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 - спасибо за это) это сработало. Не знаю, почему, хотя.