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):
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
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.