web-dev-qa-db-ja.com

Androidデータバインディングを使用してSwipeRefreshLayout更新プロパティを設定する方法?

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}" />

同様の(xml)方法でswipeRefreshLayoutの更新プロパティにバインドするオプションはありますか?

現在、setRefreshing(true/false)を呼び出してコードで設定していますが、一貫性を保つためにxmlで作成したいです。

21
daneejela

PDATED:データバインディングはxml属性名からset{AttributeName}にマッピングするため、データバインディングはsetRefreshingSwipeRefreshLayoutメソッドに値を正常に提供するため、app:refreshingを使用できます。存在し、公開されています):

<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}を使用できることに注意してください。お役に立てば幸いです。

19
rom4ek

ハッキングする必要はありません。重要な点は、 SwipeRefreshLayout documentation でパブリックメソッドを探すことです。一般に、Databindingはset部分なしで対応する名前を探します。例えば。そこにあります:

OnRefreshListener

OnRefreshListenerはパブリックインターフェイスであるため、1つのメソッドで、次のようにバインディングでこれを直接使用できます。

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>

ビューモデル:

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

これを使用してくださいapp:refreshing="@{booleanValueHere}"。データバインディングはisRefreshing関数への参照を自動的に検出します。

1
Viven