کار با اشیاء داده observable در دیتا بایندینگ ، کلاس های observable در دیتا بایندینگ یک نوع خاص برای متغیر ها هستند ،مانند نوع های دیگری که برای متغیر ها استفاده می کنیم برای مثال String ، int ، double و …
درواقع نوع Observable این قابلیت را به متغیر می دهد که زمان تغییر مقدار درون متغیر به تمام وابسته های خود یک هشدار دهد.به عبارت دیگر میتوان گفت متغیرهای از نوع Observable دیگر نیازی نیست که زمان به روزرسانی داده درون آنها کد نویسی انجام شود که UI هم بروز شود بلکه خود Observables این قابلیت را دارد که زمان به روز شدن خود آن به صورت اتوماتیک UI را هم بروز رسانی کند که این قابلیت قطعا قابلیت جذاب و کاربردی است.این در حالی ست که هر نوع شی plain-old می تواند به صورت دیتا بایندینگ پیاده و استفاده شود اما تغییر مقدار درون آن به صورت اتوماتیک منجر به بروزرسانی UI نمی شود.
نکته :
منظور از شی plain-old درواقع همان POJO یا plain old java object است که درواقع کلاس هایی است که برای مدیریت یک موجودیت در پروژه پیاده سازی و استفاده می شود .از جمله مباحث قابل استفاده در POJO ها می توان به getter و setter ها اشاره کرد.
کتابخانه Data binding به شما این اجازه را می دهد که object یا field یا حتی مجموعه ها ازجمله List را بصورت Observable پیاده کنید.زمان استفاده از دیتا بایندینگ متغیر شما این قابلیت را دارد که زمان تغییر مقدار درون آن به بقیه مولفه های وابسته خود اطلاع دهد.که این اطلاع دادن هم با استفاده از Listener یا شنوند هایی که Observable در اختیار شما قرار می دهد ممکن خواهد شد.
ما سه دسته کلاس Observable داریم که شامل objects ، fields و collections هاست.در ادامه هر کدام را مفصل توضیح خواهیم داد.زمانی که از هرکدام از سه نوع objects ، fields و collections از کتابخانه دیتا بایندینگ در UI استفاده شود ، با تغییر داده درون هر کدام از آنها ، UI هم به صورت اتوماتیک به روزرسانی می شود.
با استفاده از Observable fields شما می توانید هر نوع متغیر را بصورت Observable پیاده کنید.منظور از هرنوع درواقع هرنوع داده ای ست که میخواهید استفاده کنید.برای مثال :
برای پیاده سازی هر کدام هم تنها کافی است یک شی از نوع هر کدام از کلاس های فوق بصورت final در جاوا یا val در کاتلین ایجاد کنید.و در ادامه با استفاده از متد getter یا setter که خودِ کلاس های Observable فوق در اختیار شما قرار می دهند به داده دسترسی داشته باشید:
جاوا
private static class User {
public final ObservableField firstName = new ObservableField<>();
public final ObservableField lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
کاتلین
class User {
val firstName = ObservableField()
val lastName = ObservableField()
val age = ObservableInt()
}
و همچنین برای دسترسی به داده های درون هر شی میتوانید بصورت زیر کدنویسی کنید:
جاوا
user.firstName.set("Tejariapp.com");
int age = user.age.get();
کاتلین
user.firstName = "Tejariapp.com"
val age = user.age
بعضی مواقع شما نیاز خواهید داشت یک سری داده داینامیک را ذخیره و بازیابی کنید .بدین صورت که از تعداد و مقادیر داده ها اطلاع ندارید , ،در این حالات می توانید از کلاس ObservableArrayMap استفاده کنید که این امکان را به شما می دهد تا با استفاده از کلید ( کلید از نوع String ) به داده ها دسترسی داشته باشید.بدین صورت :
جاوا
ObservableArrayMap user = new ObservableArrayMap<>();
user.put("firstName", "Tejariapp.com");
user.put("lastName", "Inc.");
user.put("age", 17);
کاتلین
ObservableArrayMap().apply {
put("firstName", "Tejariapp.com")
put("lastName", "Inc.")
put("age", 17)
}
همچنین در لایه هم شما قادر خواهید بود به داده های درون آرایه با استفاده از کلید آنها بدین صورت دسترسی داشته باشید:
<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"/>
همچنین می توانید با کلاس ObservableArrayList به داده ها با استفاده از کلید از نوع Integer هم دسترسی داشته باشید:
جاوا
ObservableArrayList user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);
کاتلین
ObservableArrayList().apply {
add("Google")
add("Inc.")
add(17)
}
و همچنین درلایه هم بدین صورت آنها را فراخوانی کنید:
<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"/>
کلاس هایی که اینترفیس Observable را پیاده سازی می کنند به شنونده های ثبت شده در خود این اجازه را می دهند که از تغییرات مقدار درون پراپرتی ها مطلع شوند.اما کتابخانه دیتا بایندینگ برای راحتی کار کلاسی با نام BaseObservable ارائه داده که می توانید کلاس های خود را از این کلاس extend کنید ( بدین معنا که کلاس شما از کلاس BaseObservable ارث بری کند) و شنونده ها یا listener های کلاس BaseObservable را پیاده کنید.
کلاس داده یا data class ی که کلاس BaseObservable را پیاده می کند درواقع به داده های درون خود این قابلیت را داده که زمان تغییر مقدار درونشان به کلاس های وابسته خود اطلاع دهند.این عملیات با انتصاب حاشیه نوشت (annotation) مربوط به خود دیتا بایندینگ با نام Bindable برروی getter های کلاس داده و همچنین فراخوانی متد notifyPropertyChanged() درون متد stter تکمیل و پیاده میشود.توضیحات فوق در مثال زیر پیاده شده است :
جاوا
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);
}
}
کاتلین
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)
}
}
کتابخانه Data binding یک کلاس با نام BR درون ماژول پکیج تولید می کند که محتوی درون آن ID های منابع مورد استفاده برای اتصال داده است.برای مثال کد زیر مشخص کننده یک منبع مورد استفاده در لایه می باشد:
<data>
<variable
name="item"
type="com.tejariapp.sampleData" />
</data>
که در کلاس BR که توسط دیتا بایندینگ ساخته می شود ،فیلد item هم برای لایه ای که در آن استفاده شده ،ساخته می شود و می توان به صورت زیر از آن استفاده کرد:
BR.item
همچنین زمانی که شما annotation (حاشیه نوشت) Bindable را استفاده می کنید درواقع دارید یک ورودی به کلاس BR ارسال می کنید بدین معنا که اگر شما دستور زیر را نوشته باشید ،در حقیقت دارید مقدار فیلد lastName را به عنوان یک مرجع به کلاس BR جهت ساخت و شناختن در کتابخانه دیتا بایندینگ ارسال می کنید.
@Bindable
public String getLastName() {
return this.lastName;
}
امیدوارم آموزش کار با اشیاء داده observable در Data Binding برای شما مفید بوده باشد.