通过数据绑定控制视图可见性
Controlling view visibility via databinding
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="notificationResponse"
type="myms.models.NotificationResponse"/>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
...........
<TextView
android:id="@+id/tv_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/_12dp"
android:layout_marginRight="@dimen/_12dp"
android:minHeight="@dimen/_60dp"
android:gravity="center"
android:textSize="@dimen/_18sp"
android:textStyle="bold"
android:text="No Message"
android:background="@color/white"
android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>
......
</FrameLayout>
</layout>
我想要实现的是,默认情况下视图应该是 GONE,并且在我实际绑定 notificationResponse 对象的代码中进行异步调用后,它应该决定是显示还是隐藏视图。
编辑
第一种方式(根据下面的评论)是这样的:
public void setLoading(boolean loading) {
isLoading = loading;
notifyPropertyChanged(BR._all);
}
和
notifyPropertyChanged(BR.loading);
但是,有一种更简单的方法可以做到这一点,我会按以下方式完成:
首先在您的视图中更改此行
android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>
到
android:visibility="gone"/>
然后在您的 AsyncTask 中添加如下内容:
protected void onPostExecute(Boolean toBeShown) {
if(toBeShown){
tvEmptyView.setVisibility(View.VISIBLE);
}else{
tvEmptyView.setVisibility(View.GONE);
}
}
在 fragment/activity 中,您可以创建字段 int itemsCount = 0 并在收到响应后设置 itemsCount = response.payloads.size() 并在 xml 中设置 itemCount 而不是 NotificationResponse。
实际上,您必须在绑定中设置新变量才能对视图产生影响。这意味着如果你想在不改变你的情况下获得你的结果 xml 只需设置新列表你的变量并在从响应中获得响应集列表后。
你写的代码android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"
的解释是
当您的列表大小包含多个数据时,您想要隐藏它 TextView
,而在其他情况下,您想要显示它。
当您调用您的 API 时,您的列表大小肯定会小于或等于 0,因此它不会显示。
解决方案:
传递一些指示 API 仍在后台调用的变量,当 API 调用完成后,将该变量设置为 false。
android:visibility="@{notificationResponse.payloads.size() > 0 || !loading ? View.GONE : View.VISIBLE}"
这意味着如果您的列表大小超过 1,并且 API 调用完成,TextView
应该隐藏。
加载的默认值应该是 false,当您调用 API 时将该值更改为 true,当 API 调用再次完成时将其设置为 false。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="notificationResponse"
type="myms.models.NotificationResponse"/>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
...........
<TextView
android:id="@+id/tv_empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/_12dp"
android:layout_marginRight="@dimen/_12dp"
android:minHeight="@dimen/_60dp"
android:gravity="center"
android:textSize="@dimen/_18sp"
android:textStyle="bold"
android:text="No Message"
android:background="@color/white"
android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>
......
</FrameLayout>
</layout>
我想要实现的是,默认情况下视图应该是 GONE,并且在我实际绑定 notificationResponse 对象的代码中进行异步调用后,它应该决定是显示还是隐藏视图。
编辑
第一种方式(根据下面的评论)是这样的:
public void setLoading(boolean loading) {
isLoading = loading;
notifyPropertyChanged(BR._all);
}
和
notifyPropertyChanged(BR.loading);
但是,有一种更简单的方法可以做到这一点,我会按以下方式完成: 首先在您的视图中更改此行
android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>
到
android:visibility="gone"/>
然后在您的 AsyncTask 中添加如下内容:
protected void onPostExecute(Boolean toBeShown) {
if(toBeShown){
tvEmptyView.setVisibility(View.VISIBLE);
}else{
tvEmptyView.setVisibility(View.GONE);
}
}
在 fragment/activity 中,您可以创建字段 int itemsCount = 0 并在收到响应后设置 itemsCount = response.payloads.size() 并在 xml 中设置 itemCount 而不是 NotificationResponse。
实际上,您必须在绑定中设置新变量才能对视图产生影响。这意味着如果你想在不改变你的情况下获得你的结果 xml 只需设置新列表你的变量并在从响应中获得响应集列表后。
你写的代码android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"
的解释是
当您的列表大小包含多个数据时,您想要隐藏它 TextView
,而在其他情况下,您想要显示它。
当您调用您的 API 时,您的列表大小肯定会小于或等于 0,因此它不会显示。
解决方案:
传递一些指示 API 仍在后台调用的变量,当 API 调用完成后,将该变量设置为 false。
android:visibility="@{notificationResponse.payloads.size() > 0 || !loading ? View.GONE : View.VISIBLE}"
这意味着如果您的列表大小超过 1,并且 API 调用完成,TextView
应该隐藏。
加载的默认值应该是 false,当您调用 API 时将该值更改为 true,当 API 调用再次完成时将其设置为 false。