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で作成したいです。
PDATED:データバインディングはxml属性名からset{AttributeName}
にマッピングするため、データバインディングはsetRefreshing
のSwipeRefreshLayout
メソッドに値を正常に提供するため、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}
を使用できることに注意してください。お役に立てば幸いです。
ハッキングする必要はありません。重要な点は、 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);
}
}
これを使用してくださいapp:refreshing="@{booleanValueHere}"
。データバインディングはisRefreshing関数への参照を自動的に検出します。