Android RecyclerView Adapter İçerisinde Databinding Kullanımı

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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir