android - 通过 DataBinding 控制 Recycler View 项目的 UI 可见性
问题描述
我正在学习 MVVM 与 Android 中的数据绑定,并坚持在回收站视图中维护项目的 UI 可见性状态。每件商品都有 2 个文本视图 - 标题(可见)和描述(隐藏)。Onclick 标题,我想显示/隐藏描述。为了保持其 UI 状态,我在 POJO 中有一个布尔字段(与 DB 作为实体共享)。
OnClick 的标题,我正在尝试设置此字段。如何使更改触发器更改可见性并在滚动期间保持它?
这是代码的Github 链接,下面是我想要工作的代码片段。
遵循带有存储库的 MVVM 架构,以访问网络并更新数据库并通过 LiveData 观察数据。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp">
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_margin="8dp"
android:text="@{posts.desc}"
android:textSize="14sp"
android:visibility="@{(posts.isDescVisible()) ? View.VISIBLE : View.GONE}"
tools:text="This is an answer provided by the creator to test the UI layout" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_margin="2dp"
android:ellipsize="end"
android:maxLines="1"
android:onClick="@{()-> posts.setDescVisible(!posts.isDescVisible())}"
android:text="@{posts.title}"
android:textSize="16sp"
android:textStyle="bold"
tools:text="This is a question" />
</RelativeLayout>
<data>
<import type="android.view.View" />
<variable
name="posts"
type="com.tyagiabhinav.loremipsum.model.db.Posts" />
</data>
</layout>
解决方案
这对我很有效
import androidx.databinding.BaseObservable;
public class Posts extends BaseObservable {
private int id;
private final String title;
public final String desc;
private boolean descVisible;
public Posts(String title, String desc) {
this.title = title;
this.desc = desc;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getDesc() {
return desc;
}
public void setDescVisible(boolean descVisible) {
this.descVisible = descVisible;
notifyPropertyChanged(BR.descVisible);
}
@Bindable
public boolean isDescVisible() {
return descVisible;
}
}
和 xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp">
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_margin="8dp"
android:text="@{posts.desc}"
android:textSize="14sp"
***android:visibility="@{posts.descVisible ? View.VISIBLE : View.GONE}"***
tools:text="This is an answer provided by the creator to test the UI layout" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_margin="2dp"
android:ellipsize="end"
android:maxLines="1"
android:onClick="@{()-> posts.setDescVisible(!posts.descVisible)}"
android:text="@{posts.title}"
android:textSize="16sp"
android:textStyle="bold"
tools:text="This is a question" />
</RelativeLayout>
<data>
<import type="android.view.View" />
<variable
name="posts"
type="com.tyagiabhinav.loremipsum.model.db.Posts" />
</data>
</layout>
推荐阅读
- powershell - ShellLauncher 将应用程序移动到 c:/windows/system32
- javascript - 如何模拟我的测试类用玩笑所做的导入?
- javascript - 反应选择下拉onChange过滤器并重置为先前/原始状态?
- objective-c - Cenario VR iOS课程一次又一次从头开始
- laravel-5 - Laravel 从路由文件重定向到另一条路由
- ios - UItableview在内容中加载缓慢的ios
- javascript - scrollToTop 不适用于 jQuery(document).on('ready', function() {
- javascript - 在 routes.js 文件中使用 JSX 错误时,“React”必须在范围内
- c++ - 如何在 C++ vs CPLEX 中实现宏节点回调
- javascript - 页面不刷新反应