首页 > 解决方案 > 通过 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>

标签: androiddata-bindingandroid-databindingandroid-jetpack

解决方案


这对我很有效

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>

推荐阅读