如何使用android数据绑定设置SwipeRefreshLayout刷新属性?

2024-01-16

我正在使用 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(使用前将#替换为@)

如何使用android数据绑定设置SwipeRefreshLayout刷新属性? 的相关文章

随机推荐