Menggunakan objek data yang dapat diobservasi (observable)

Kemampuan observasi mengacu pada kemampuan objek untuk memberi tahu objek lain tentang perubahan pada datanya. Library Data Binding memungkinkan Anda menjadikan objek, kolom, atau koleksi dapat diobservasi.

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 yang dapat diobservasi: 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 yang dapat diobservasi

Perlu 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 dasar berikut agar kolom menjadi dapat diobservasi (observable):

Kolom yang dapat diobservasi adalah objek yang dapat diobservasi mandiri yang memiliki satu kolom. Versi dasar 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 pengakses set() dan get() atau gunakan sintaksis properti Kotlin:

Kotlin

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

    

Java

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

    

Koleksi yang dapat diobservasi

Beberapa aplikasi menggunakan struktur dinamis untuk menampung data. Koleksi yang dapat diobservasi memungkinkan akses ke struktur ini melalui penggunaan kunci. Class ObservableArrayMap berguna jika 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 jika kunci ini berupa integer, 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 yang dapat diobservasi

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

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 pengambil dan memanggil metode notifyPropertyChanged() dalam penyetel, seperti yang ditunjukkan pada 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 dalam file class BR saat kompilasi. Jika class dasar untuk class data tidak dapat diubah, antarmuka Observable dapat diimplementasikan menggunakan objek PropertyChangeRegistry untuk mendaftarkan dan memberi tahu pemroses secara efisien.

Referensi lainnya

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

Contoh

Codelab

Postingan blog