Android Retrofit Kütüphanesi ile Veri Çekme ve RecyclerView’de Listeleme
Herkese selam, ilk yazımda en temel uygulamalardan biri olan Kotlin ile Retrofit kütüphanesini kullanarak verileri çekip listelemeyi inceleyeceğiz.
Retrofit, Square firması tarafından geliştirilen açık kaynak kodlu bir REST istemcisidir. REST API kullanarak attığımız istek sonucunda JSON formatında dışarıya açılmış verileri uygulamalarımızda kolayca kullanabilmemizi sağlar.
Uygulamaya başlamadan önce kullanacağımız API’yi inceleyelim. https://api.coinranking.com/v1/public/coins adresine gittiğimizde karşımıza uzuuun bir json objesi dönmektedir. Bu veriyi resimdeki gibi daha okunaklı bir şekilde görüntülemek isterseniz Chrome eklentisi ekleyebilirsiniz. Bize dönen json objesinde data’nın altında coins adlı bir listenin döndüğünü görüyoruz. Uygulamamızın sonunda coins listesinin elemanlarını listeliyor olacağız.
Peki ya biz nerden bulacağız bu apileri? diye sorarsanız google’da free api diye aratmanız yeterli :) Ayrıca Facebook gibi büyük şirketlerin de paylaşmış oldukları apilere rahatlıkla ulaşabilirsiniz.
Herkes hazırsa lafı uzatmadan kodlamaya başlayalım.
Projemizi oluşturduktan sonra ilk iş olarak verilere erişebilmek için internet iznini manifest dosyasına aşağıdaki gibi tanımlamamız gerekiyor.
<uses-permission android:name="android.permission.INTERNET"/>
Ardından projede kullanacağımız Retrofit kütüphanesini ve resimleri yüklemek için kullanmış olduğum GlideToVectorYou kütüphanesini indirelim.
Servisten bize JSON objesi döndüğünü söylemiştik. Uygulamamızda bu json objesini sınıflara dönüştürmemiz gerekiyor. İçe içe gördüğümüz her bir obje ayrı sınıflar şeklinde tanımlanmalıdır. Bunu tek tek kendimiz de yapabiliriz ancak bu hem uzun süren bir işlem olacaktır hem de daha karmaşık verilerde objeleri ayırt etmemiz zorlaşacaktır. Tabii ki bizim için verileri sınıflara dönüştüren birçok araçlar mevcut. Bizim kullanacağımız eklentiye Android Studio’da Ayarlar->Plugins kısmında json yazarak indirebilirsiniz.
Bu eklentiyi kullanabilmek için resimdeki gibi sınıfları oluşturmak istediğiniz proje dizinine sağ tıklayarak Kotlin data class File from JSON seçmelisiniz.
Seçtiğinizde karşınıza açılan ekrana JSON objesini yerleştirip sınıfınızın ismini vermelisiniz. Ben “Coins” ismini vermeyi tercih ettim. Advanced seçeneği ile istediğiniz özellikleri seçebilirsiniz, Annotation’ı Gson veya kotlinx.serialization olarak seçmelisiniz.
Sınıfları Gson ile oluşturduğunuzda değişkenlerin başında örneğin @SerializedName(“data”) yazdığını göreceksiniz. Burada yazan değişken adının serviste yazan değişken adıyla aynı olması gerekmektedir, aksi halde dönüşüm yapılamayacaktır. SerializedName’i json ile aynı verdiğinizde val değişkenin adını istediğiniz gibi değiştirebilirseniz (örnek:myData). Ancak kod okunaklığı açısından ikisini de aynı isimle kullanmanız tavsiye edilir. Tüm bu işlemleri tamamladıktan sonra sınıflarımız hazır hale geldi 😊
Gelelim artık Retrofit kullanımına.. Endpointleri yazdığımız bir interface retrofiti kullanmamız için yeterli. Hangi tipte(get,post,put,delete vb) istek atacaksak istek atacağımız fonksiyonun başında belirtmemiz gerekiyor.
Biz sadece veri çekeceğimiz için get metodunu yazmamız yeterli. @GET’in içine verdiğimiz parametre servise bağlanmak için kullanacağımız base url den sonraki değişken kısım olan “coins” olacaktır. Kısaca bu fonksiyon aracılığıyla servisten belirttiğimiz url’deki verileri çek demiş oluyoruz. Çekilen verileri oluşturduğumuz Coins objesiyle dönüyoruz.
Interface’i tanımladıktan sonra artık Retrofit objesini oluşturabiliriz. Main Activity’e aşağıdaki kodları yazalım.
Burada önemli olan base url’i doğru verebilmek. Servis linkinin sabit olan kısmını parametreye vermeliyiz. Ayrıca JSON’dan gelen verileri Gson aracılığıyla dönüştürdüğümüz için GsonConverterFactory.create() parametresini de vermeliyiz. Retrofit objemizi oluşturduğumuza artık tanımlanan api değişkeniyle servise bağlanabiliriz.
Burada görmüş olduğumuz enqueue içine bir Callback objesi alarak arka planda çalıştırıyor ve bize callback yardımıyla dönen sonucu haber veriyor. Callback’in içine ise servisten gelen datayı karşılayacak olan Coins sınıfımızı yazıyoruz. Api üzerinden interface’te tanımlı olan endpointlerden herhangi birine bir sorgu attığımızda karşımızda iki ihtimal var. Eğer internet bağlantısında sorun yaşanırsa veya server url’ini yanlış yazdığımızda onFailure metodu çalışır, servise bağlanabildiğimizde ise onResponse metodu çalışmaktadır. OnResponse metodunda tüm verilere response.body()!! ile ulaşabiliriz. Ancak biz data objesinin içindeki coins listesini istediğimiz için response.body()!!.data.coins diyerek RecyclerView adaptörüne listeyi çekip yolluyoruz.
Vee retrofit kullanımı bu kadar basit 😊 Yazının ilerleyen kısımlarda tasarım ekranlarından ve RecyclerView kullanımından bahsedeceğiz.
Hızlıca layout dosyalarını yazalım. Uygulamamız tek bir ekrandan oluşacak, bütün sayfada coinleri listeleyeceğiz. Dinamik bir şekilde listelemek için recyclerview’i ekleyelim.
Ardından Recycler View’de listeleyeceğimiz satır tasarımı için item_coin.xml adında layout dosyası açalım ve içini aşağıdaki gibi dolduralım.
Apiden çektiğimiz verileri Recycler View’de göstermek için bir adapter sınıfına ihtiyacımız var. Farkettiyseniz Main Activity’de çektiğimiz verileri CoinAdapter sınıfına göndermiştik ve recycler view e bu adapter’ü bağlamıştık. Gelin şimdi adapter sınıfımızın içinde neler olması gerekiyor onları inceleyelim.
Adapter sınıfımız öncelikle parametre olarak coins listesini almalı. Adapter sınıfımızın arayüzdeki elemanları tanıması için ViewHolder sınıfına ihtiyacı var. İtem_coin.xml dosyasında oluşturmuş olduğumuz her bir satırın içinde bulunan bileşenlerini id’leri yardımıyla tanımlıyoruz.
Adapter sınıfını Recycler.Adapter sınıfına kalıtım ettiğimiz için metodlarını implement etmemiz gerekiyor. Bu metodlardan kısaca bahsetmek gerekirse;
onCreateViewHolder() : Bu method adaptör oluşturulduğunda oluşturduğumuz ViewHolder’ın başlatılması için çağrılır.
onBindViewHolder() : onCreateViewHolder’dan dönen verileri bağlama işlemini gerçekleştirildiği metotdur.
getItemCount() : Listemizin eleman sayısını döndüren metottur.
Bu sınıfta farklı olarak resimleri yüklemek için GlideToVectorYou isimli ekstra bir kütüphane kullandım.
Adapter sınıfımızı da yazarak uygulamamızı tamamlamış olduk. Uygulamamızın çalışır halini aşağıdaki gibi görebilirsiniz. Herhangi bir sorunuz olursa bana ulaşmaktan lütfen çekinmeyin 😊
Proje dosyalarına buradan ulaşabilirsiniz.