Selamlar,
Bir süre önce synthetic sınıfı deprecated oldu. Bu yüzden artık RecyclerView adapter’larımızda alternetif yöntemler kullanmamız gerekti. Bugün en popüler olan databinding kullanılırak view’lere nasıl erişeceğimize bakacağız.
Adım 1: XML Oluşturma
res/layout klasörümüze sağ tıklayarak yeni bir layout ekliyoruz. Adı item_home.xml olsun.
İPUCU: Oluşturduğunuz yeni xml dosyasında otomatik gelen ConstaintLayout view’ına farenin imlecini getirip “option + enter” tuşuna basarsanız bu layoutu otomatik olarak bind edilebilir bir XML’e çevirir.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
Bu XML’i otomatik olarak
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Buna çevirir.
Yeni XML içeriğimizde en önemli şey <layout> </layout> taglarıdır. Bütün view’lerimiz bunların içerisinde olmalıdır. Bundan sonra otomatik olarak Binding dosyamız oluşturulacaktır.
Adım 2: Adapter Binding
Oluşturduğumuz adapter class’ımızda değişmesi gereken 2 önemli nokta vardır. Birisi onCreateViewHolder içerisindeki view iflate işlemi, diğeri ise ViewHolder class’ımızın constractor’ına otomatik oluşturulan binding dosyamızın eklenmesi.
Bir örnek ile açıklayalım.
class ItemAdapter(
private val itemModel: List<ItemModel>?
) : RecyclerView.Adapter<ItemAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = ItemHomeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
itemModel?.let { holder.bind(it[position]) }
}
override fun getItemCount(): Int {
return itemModel?.size ?: 0
}
inner class ViewHolder(private val binder: ItemHomeBinding) : RecyclerView.ViewHolder(binder.root) {
fun bind(model: itemModel) {
// do something...
binder.textView.text = "Enter"
}
}
}
Artık bind metodumuzun içerisine her item için yapmak istediğimiz şeyi yapabiliriz.
NOT: Otomatik oluşturulan Binding dosyamızın formatı şu şekildedir
item_home.xml -> ItemHomeBinding