Android Data Binding + RecyclerView + Multiple View Type

Mert SIMSEK
3 min readAug 8, 2016

--

Aslında bu yazıyı yazmadan önce data bindingi enine boyuna inceleyen bi yazı yazma planım vardı ama sürekli ata ata yazı yazamayacağımı farkettim ve data binding kullanmış olanlar için quick bi yazı hazırlamak istedim. Eğer daha önce androidde databinding kullanmadıysanız bu yazıdan önce birazcık araştırmakta fayda var çünkü yazıyı daha önce biraz da olsa tecrübe etmiş kişiler için yazacağım. Başlangıç için şuradan databinding sunumuma ulaşabilirsiniz. Bu yazımda örnek olarak şu anda yapmakta olduğum otel uygulamasındaki AutoComplete listesini örnek olarak kullanacağım. Yani headerView ve regionItem olarak iki çeşit viewtype’ım olacak.

RecyclerView + DataBinding

item_autocomplete.xml

layout dosyasına gönderdiğimiz Region modeline göre recyclerview item iconu data.icon kullanarak, labeli ise data.label ı kullanarak alıyor.

AutoCompleteAdapter.java

ViewHolder içersinde ItemAutoCompleteBinding generated sınıf olarak oluşturuluyor. Biz de bu sınıfı çağırarak inflate ediyoruz. Layout dosyamızda hangi variable varsa, oluşturulan Binding sınıfı bunun setter’ını bizim için hazırlıyor. Burada layout dosyamızda data variable’ı oluşturduk ve binding.setData() methodunu kullanabiliyoruz artık. Basit anlamda bir recyclerviewadapter yazmak istersek tüm yapmamız gerekenler bu kadar. FindViewById yok, @BindView yok, ButterKnife.bind(this, itemview) yok. Ve bütün bu binding views işlemi compile time’da gerçekleşiyor. Yani çok daha hızlı.

RecyclerView + DataBinding + Multiple View Type

Çoğu zaman recyclerview kullandığımızda headerview ya da başka bi deyişle farklı view typelar kullanıyoruz. Databinding bunu da unutmamış sağolsun. Küçük bir örnekle onu da gösterelim. Ben burda header kullanacağım. zaten kullanımı anlarsak dilediğiniz gibi kullanabilirsiniz.

Header için yeni bir layout dosyası oluşturuyoruz. Burdaki en önemli nokta variable isminin diğer viewtype layoutlardaki ile aynı olması. Çünkü shared name olarak ikisi de aynı olmak zorunda. Yani item_autocomplete.xml ‘de variable nameimiz “data” idi. item_autocomplete_header.xml layoutumuzdaki variable name’imiz de “data” olmalı.

Şimdi adapter’imizde ufak bir kaç değişiklik yapmalıyız.

Adapter’de ne değişiklikler yaptık? Ve neden yaptık?

  • Öncelikle adapter’imiz sadece region listesi alıyordu bunu object liste çevirdik. Böylece farklı sınıfların instancelarının olduğu bir listeyi adapterimize verebilecektik.(İlk indexte Header nesnesi olacak ve kalanında region listesi olacak)
  • Diğer bi değişiklik de RecyclerView ata sınıfından getItemViewType methodunu override ettik ve hangi instance için hangi layout’u döndürmesi gerektiğini söyledik. Yani eğer listedeki item Region sınıfının instance’ıysa R.layout.item_autocomplete, AutoCompleteHeader sınıfının instance’ıysa da R.layout.item_autocomplete_header döndür.
  • Burdaki en önemli değişikliklerden birine gelicek olursak, viewholderımızın içersindeki değişik dikkatinizi çekmiş olmalı. Adapterimizde sadece tek bir view type varken ItemAutoCompleteBinding(Generated Class)’i kullanıyorduk. Şimdi ise ViewDataBinding sınıfını kullanıyoruz. Çünkü ViewDataBinding sınıfı ata sınıftır. Yani her iki layout için de binding yapabiliriz. Ve create ederken belirlediğimiz viewType’ı da inflate ediyoruz.
...
ViewDataBinding binding = DataBindingUtil.inflate(inflater, viewType, parent, false);
...
  • Ve bind işleminin yapıldığı yer. Normalde eğer layoutumuzda region diye bir variable’ımız varsa binding.setRegion() çağırarak bind ediyorduk. Şimdi ise binding.setVariable(BR.data, data) şeklinde bind ediyoruz.

Kısacık Açıklama

Normalde item_region.xml layoutumuz varsa ItemRegionBinding sınıfını kullanıyorduk. ve binding.setRegion(Region) diyorduk. item_header.xml layoutumuz varsa da ItemHeaderBinding sınıfını kullanıyorduk. Ve binding.setHeader(Header) diyorduk. Burda ikisini de kullanmamız gerektiği için getItemViewType() methodunu override ederek iki layoutumuzun da id’lerini verdik. Her iki layoutda da variable name’i aynı verdik(“data”). Ve ViewDataBinding sınıfını kullandık. Ve binding.setVariable(BR.data, data) ile binding yaptık.

Kişisel izlenim

Basit anlamda kullandığım databinding’i şu anda büyük bi projede kullanmaya başladım. Evet ilk etapda zorlukları var fakat bütün view injectionlardan bizi kurtarıyor. Bundan sonra da kullanmaya devam edeceğimi düşündüğüm bir kütüphane. MVP mimarisi kullanıyorsanız velki bunu değiştirmenize sebep olabilir. Data Binding, MVVM mimarisiyle kullanılması gereken bir kütüphane olduğunu düşünüyorum. MVVM’in de artıları, eksileri var bunlara zaman bulursam başka bi yazıda değinmek istiyorum.

Bonus Gif

Me after send model to complex layout file

Kaynak

--

--

Mert SIMSEK
Mert SIMSEK

Responses (3)