Menggunakan objek data observable

Observabilitas mengacu pada kemampuan objek untuk memberi tahu objek lain tentang perubahan pada datanya. Library Data Binding memungkinkan Anda menjadikan objek, kolom, atau koleksi dapat diamati (observable).

Semua objek lama biasa dapat digunakan untuk data binding, tetapi mengubah objek tidak otomatis menyebabkan diperbaruinya UI. Data binding dapat digunakan untuk memberi objek data Anda kemampuan untuk memberi tahu objek lain, yang disebut listener (pemroses), saat datanya berubah. Ada tiga jenis class observable: objek, kolom, dan koleksi.

Saat salah satu objek data observable ini terikat ke UI, dan properti objek data tersebut berubah, UI akan otomatis diperbarui.

Kolom observable

Diperlukan sedikit pekerjaan untuk membuat class yang menerapkan antarmuka Observable, yang mungkin tidak sepadan dengan usahanya jika class Anda hanya memiliki beberapa properti. Dalam hal ini, Anda dapat menggunakan class Observable generik dan class khusus primitive berikut agar kolom menjadi observable:

Kolom observable adalah objek observable mandiri yang memiliki satu kolom. Versi primitive ini menghindari boxing dan unboxing selama operasi akses. Untuk menggunakan mekanisme ini, buatlah properti public final dalam bahasa pemrograman Java atau properti hanya-baca di Kotlin, seperti ditunjukkan dalam contoh berikut:

Kotlin

    class User {
        val firstName = ObservableField<String>()
        val lastName = ObservableField<String>()
        val age = ObservableInt()
    }

    

Java

    private static class User {
        public final ObservableField<String> firstName = new ObservableField<>();
        public final ObservableField<String> lastName = new ObservableField<>();
        public final ObservableInt age = new ObservableInt();
    }

    

Untuk mengakses nilai kolom, gunakan metode accessor set() dan get(), seperti berikut:

Kotlin

    user.firstName = "Google"
    val age = user.age

    

Java

    user.firstName.set("Google");
    int age = user.age.get();

    

Koleksi observable

Beberapa aplikasi menggunakan struktur dinamis untuk menampung data. Koleksi observable memungkinkan akses ke struktur ini melalui penggunaan kunci. Class ObservableArrayMap berguna saat kunci ini berjenis referensi, misalnya String, seperti ditunjukkan dalam contoh berikut:

Kotlin

    ObservableArrayMap<String, Any>().apply {
        put("firstName", "Google")
        put("lastName", "Inc.")
        put("age", 17)
    }

    

Java

    ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
    user.put("firstName", "Google");
    user.put("lastName", "Inc.");
    user.put("age", 17);

    

Dalam tata letak, peta dapat ditemukan menggunakan kunci string, sebagai berikut:

<data>
        <import type="android.databinding.ObservableMap"/>
        <variable name="user" type="ObservableMap<String, Object>"/>
    </data>
    …
    <TextView
        android:text="@{user.lastName}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="@{String.valueOf(1 + (Integer)user.age)}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

Class ObservableArrayList berguna saat kunci ini berupa bilangan bulat, seperti berikut:

Kotlin

    ObservableArrayList<Any>().apply {
        add("Google")
        add("Inc.")
        add(17)
    }

    

Java

    ObservableArrayList<Object> user = new ObservableArrayList<>();
    user.add("Google");
    user.add("Inc.");
    user.add(17);

    

Dalam tata letak, daftar dapat diakses melalui indeks, seperti ditunjukkan dalam contoh berikut:

<data>
        <import type="android.databinding.ObservableList"/>
        <import type="com.example.my.app.Fields"/>
        <variable name="user" type="ObservableList<Object>"/>
    </data>
    …
    <TextView
        android:text='@{user[Fields.LAST_NAME]}'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

Objek observable

Class yang menerapkan antarmuka Observable memungkinkan pendaftaran pemroses yang ingin diberi tahu mengenai perubahan properti pada objek observable.

Antarmuka Observable memiliki mekanisme untuk menambahkan dan menghapus pemroses, tetapi Anda harus menentukan kapan notifikasi dikirim. Untuk mempermudah pengembangan, Library Data Binding menyediakan class BaseObservable, yang menerapkan mekanisme pendaftaran pemroses. Class data yang menerapkan BaseObservable bertanggung jawab memberitahukan kapan properti berubah. Hal ini dilakukan dengan menetapkan anotasi Bindable ke getter dan memanggil metode notifyPropertyChanged() di setter, seperti ditunjukkan dalam contoh berikut:

Kotlin

    class User : BaseObservable() {

        @get:Bindable
        var firstName: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.firstName)
            }

        @get:Bindable
        var lastName: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.lastName)
            }
    }
    

Java

    private static class User extends BaseObservable {
        private String firstName;
        private String lastName;

        @Bindable
        public String getFirstName() {
            return this.firstName;
        }

        @Bindable
        public String getLastName() {
            return this.lastName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
            notifyPropertyChanged(BR.firstName);
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
            notifyPropertyChanged(BR.lastName);
        }
    }

    

Data binding menghasilkan class dengan nama BR dalam paket modul yang berisi ID dari semua resource yang digunakan untuk data binding. Anotasi Bindable menghasilkan entri di file class BR selama kompilasi. Jika class dasar untuk class data tidak dapat diubah, antarmuka Observable dapat diterapkan menggunakan objek PropertyChangeRegistry untuk mendaftarkan dan memberi tahu pemroses secara efisien.

Referensi lainnya

Untuk mempelajari data binding lebih lanjut, lihat referensi tambahan berikut.

Sampel

Codelab

Entri blog