我正在使用 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 中使其保持一致。
无需破解。关键是寻找公共方法SwipeRefreshLayout 文档 https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html。一般来说,数据绑定会寻找相应的名称而不带set
部分。例如。你会在那里找到:
-
setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener 侦听器) https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html#setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener)
- setRefreshing(布尔刷新) https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html#setRefreshing(boolean)
OnRefresh监听器
由于 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>
视图模型-kotlin:
class ViewModel(
private val provider: DataProvider
) : DataProvider.Callback {
/* isLoading - Needs to be public for Databinding! */
val isLoading = ObservableBoolean()
/* onRefresh() - Needs to be public for Databinding! */
fun onRefresh() {
isLoading.set(true)
provider.fetch(this)
}
fun onReady() = isLoading.set(false)
fun onError(oops: Exception) = isLoading.set(false)
}
视图模型-java:
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)