DataBinding + ViewModel

Thêm DataBinding vào project
trong build.gradle : android{ buildFeatures{ dataBinding true }}

Trong file layout của mỗi class sẽ có format chung

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>

<variable
name="UserViewModel"
type="com.example.databindingactivityfragmentwithmvvm.UserViewModel" />
</data>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UserViewModel.name}"
android:textColor="@color/black"
android:textSize="25sp"
android:textStyle="bold" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UserViewModel.address}"
android:textColor="@color/black"
android:textSize="25sp" />
</LinearLayout>

</layout>
type là đường dẫn đến class ViewModel() của file layout này.
-Dữ liệu được gán trực tiếp vào view không cần thông qua ánh xạ ID để truyền cho view

*Khởi tạo binding trong Acitivity, Fragment, RecyclerView
-Actitity :  theo 2 cách 
 
+binding = ActivityMainBinding.inflate(Layoutinflater)
setContentView(binding.root)

+binding = DataBindingUtil.setContentView(this, R.layout.activity_main.xml)

-Fragment: theo 2 cách

+binding = FragmentMyBinding.inflate(inflater, parent, false)
return binding.root

+ val layoutInflater = LayoutInflater.from(parent.context)
binding = DataBindingUtil.inflate(layoutInflater , R.layout.fragment_my.xml, viewGroup, false)
return binding.root

-RecyclerViewAdapter
+val layoutInflater = LayoutInflater.from(parent.context)
binding = ItemBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)

+val layoutInflater = LayoutInflater.from(parent.context)
binding = DataBinding.inflate(layoutInflater, R.layout.item , parent, false)
return ViewHolder(binding)


*Xử lý sự kiện

1.Methor Reference : (Không tham số) 

-Tại class viewmodel tạo một phương thức để xử lý sự kiện như : 
class MainViewModel(
private var name: String
) {
fun getName() = name
fun setName(name: String){
this.name = name
}

fun showLogMessage(view: View){
Log.e("Huy", "Huy")
}
}
tại file layout tai ánh xạ view cần xử lý sự kiện đến với phương thức trên như :

<data>

<variable
name="MainViewModel"
type="com.example.databindingactivityfragmentwithmvvm.MainViewModel" />
</data>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{MainViewModel::showLogMessage}"
android:text="Button" />
Lúc này khi button nhận sự kiện click thì nhưng dòng lệnh trong phương thức showLogMessage() sẽ được thực thi
Lưu ý: thuộc tính click của view có thêm 
Những thuộc tính này sẽ thay thế cho onClick = "" , tương ứng cho từng view riêng biệt

2. Listener Binding (có tham số)
-Phương thức không tham số
class MainViewModel(
private var name: String
) {
fun getName() = name
fun setName(name: String){
this.name = name
}

fun showLogMessage(){
Log.e("Huy", "Huy")
}
}
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{() -> MainViewModel.showLogMessage()}"
android:text="Button" />

-Phương thức có tham số
fun showLogMessage2(message: String){
Log.e("Huy", message)
}
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{() -> MainViewModel.showLogMessage2(, MainViewModel.getName())}"
android:text="Button" />

-Phương thức có tham số là view: View
fun showLogMessage3(view: View, message: String){
Log.e("Huy", message)
}
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{(view) -> MainViewModel.showLogMessage3(view, MainViewModel.getName())}"
android:text="Button" />

Nhận xét