Android Volley kütüphanesi ile veri çekme işlemi

Merhabalar,


Bu yazıda Android'de bulunan Volley kütüphanesi ile bir API linkinden veri çekme işlemi üzerinde duracağız. Çektiğimiz verileri JSON Parse işleminden geçirerek ekranda göstereceğiz. Bu işlemleri Kotlin diliyle gerçekleştireceğiz. Ayrıca RecyclerView ve CardView kullanımına da ufak bir bakış atmış olacağız.


Örnek projeyi inceleyebilmeniz adına Github üzerinden paylaştım: Örnek proje linki


API için şu linki kullanacağız. Linke baktığımız zaman bize bir kullanıcı listesi dönmekte. Kullanıcıların ad, e-posta adresi ve telefon bilgilerini ekranda listeleyeceğiz.


İlk olarak Android Studio'da boş bir proje oluşturuyoruz.


Hemen ardından build.gradle dosyasına girerek gerekli kütüphaneleri ekliyoruz ve senkronizasyon (Sync) işlemi yapıyoruz:

implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.volley:volley:1.1.0'


activity_main.xml dosyasını açarak tüm ekranı kaplayacak şekilde RecyclerView'ı yerleştiriyoruz:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.activity.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvUsers"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"/>

</android.support.constraint.ConstraintLayout>


list_item.xml adında bir layout dosyası açarak RecyclerView'da görünecek elemanlar için özel (custom) ve basit bir tasarım oluşturuyoruz:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/root"
        android:padding="5dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:text="Leanne Graham"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvName"
            android:textSize="20sp"
            android:drawableStart="@drawable/ic_name"
            android:drawablePadding="10dp"
            android:textColor="@color/colorPrimary"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent"/>

        <TextView
            android:text="[email protected]"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvEmail"
            android:textSize="15sp"
            android:drawableStart="@drawable/ic_email"
            android:drawablePadding="10dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/tvName"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"/>

        <TextView
            android:text="1-770-736-8031 x56442"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvPhone"
            android:textSize="15sp"
            android:drawableStart="@drawable/ic_phone"
            android:drawablePadding="10dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/tvEmail"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"/>

    </android.support.constraint.ConstraintLayout>

</android.support.v7.widget.CardView>


Uygulamamızın Volley isteklerini karşılaması için VolleySingleton adında bir sınıf (class) oluşturuyoruz:

package com.yusufborucu.volleysample

import android.app.Application
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.Volley

class VolleySingleton : Application() {
    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    val requestQueue: RequestQueue? = null
        get() {
            if (field == null) {
                return Volley.newRequestQueue(applicationContext)
            }
            return field
        }

    fun <T> addToRequestQueue(request: Request<T>) {
        request.tag = TAG
        requestQueue?.add(request)
    }

    companion object {
        private val TAG = VolleySingleton::class.java.simpleName
        @get:Synchronized var instance: VolleySingleton? = null
            private set
    }
}


AndroidManifest.xml dosyasını açarak oluşturduğumuz VolleySingleton sınıfını ekliyoruz. Ayrıca veri çekme işlemi için internet gerekeceğinden internet iznini de dahil ediyoruz:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.yusufborucu.volleysample">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name=".VolleySingleton"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning">
        <activity android:name=".ui.activity.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>


Projemizi düzenli bir şekilde ilerletmek adına ufak bir paket yapısı oluşturuyoruz:

com.yusufborucu.volleysample

-> model

-> ui

--> activity

--> adapter


Veri modelimizi belirtmek adına model paketimiz içerisinde User adında bir sınıf oluşturuyoruz:

package com.yusufborucu.volleysample.model

data class User(
    val name: String = "",
    val email: String = "",
    val phone: String = ""
)


Verileri RecyclerView içerisinde listelemek için ui/adapter paketimiz içerisinde UserAdapter adında bir sınıf oluşturuyoruz:

package com.yusufborucu.volleysample.ui.adapter

import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.yusufborucu.volleysample.R
import com.yusufborucu.volleysample.model.User
import kotlinx.android.synthetic.main.list_item.view.*

class UserAdapter(private val users : MutableList<User>) : RecyclerView.Adapter<UserAdapter.UserViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item,parent,false)
        return UserViewHolder(v)
    }

    override fun getItemCount(): Int {
        return users.size
    }

    fun add(item:User, position:Int) {
        users.add(position, item)
        notifyItemInserted(position)
    }

    fun remove(item:User) {
        val position = users.indexOf(item)
        users.removeAt(position)
        notifyItemRemoved(position)
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        val user = users[position]
        holder.itemView.tvName.text = user.name
        holder.itemView.tvEmail.text = user.email
        holder.itemView.tvPhone.text = user.phone
    }


    class UserViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
}


MainActivity sınıfımızı ui/activity paketimiz içerisine taşıyoruz. Ve MainActivity içerisinde API linkimize Volley ile isteği yapıp gelen veriyi JSON Parse işleminden geçirerek ekranda gösteriyoruz:

package com.yusufborucu.volleysample.ui.activity

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.widget.Toast
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.yusufborucu.volleysample.R
import com.yusufborucu.volleysample.model.User
import com.yusufborucu.volleysample.ui.adapter.UserAdapter
import org.json.JSONArray
import org.json.JSONException

class MainActivity : AppCompatActivity() {

    val users = mutableListOf<User>()
    var recylerView: RecyclerView? = null
    val URL = "https://jsonplaceholder.typicode.com/users"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recylerView = findViewById(R.id.rvUsers)

        getUsers()
    }

    private fun getUsers() {
        val stringRequest = StringRequest(
            Request.Method.GET,
            URL,
            Response.Listener<String> { s ->
                try {
                    val array = JSONArray(s)
                    for (i in 0 until array.length()) {
                        val obj = array.getJSONObject(i)
                        users.add(
                            User(
                                obj["name"].toString(),
                                obj["email"].toString(),
                                obj["phone"].toString()
                            )
                        )
                    }
                    recylerView?.layoutManager = LinearLayoutManager(this)
                    recylerView?.adapter = UserAdapter(users)
                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            },
            Response.ErrorListener { error ->
                Toast.makeText(this, error.message, Toast.LENGTH_SHORT).show()
            })

        val requestQueue = Volley.newRequestQueue(this)
        requestQueue.add<String>(stringRequest)
    }
}


Uygulamayı çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olacaktır:


İyi çalışmalar.

Yusuf Borucu

Yazılımı iş ve hobi olarak yapan bir insan evladıyım. Yazılıma yönelik uğraştığım ve ilgi duyduğum teknolojiler; Laravel, Android (Kotlin & Java), Vue.js ve Node.js. Her geçen gün kendimi geliştirmeye gayret gösteriyorum....

"Android Volley kütüphanesi ile veri çekme işlemi" için 7 yorum yapıldı.
I
ilkertr 12 Mart 2020

Bu örneğe binlerce kaydı 10 arlı sayfalayarak listeleme eklenebilir mi?

Yusuf Borucu (Yazı sahibi)27 Mart 2020

Eklenebilir ancak bu bambaşka bir yazı konusu olur. İlerleyen zamanlarda bu konu üzerine bir yazı yayımlayabilirim. Google üzerinden 'recyclerview pagination' şeklinde aratarak çeşitli sonuçlara ulaşabilirsiniz. Örnek olarak şu linke bakabilirsiniz: https://medium.com/@thegraduateguy/pagination-with-recyclerview-in-android-2506c4d09a5c

Z
Zeey 12 Mayıs 2020

merhaba, ben mysql veritabanından çektiğim verileri mobil uygulamada spinnerda listelemek istiyorum. İnceledim fakat bana biraz karmaşık geldi. Lütfen yardımcı olabilir misiniz?

Yusuf Borucu (Yazı sahibi)14 Mayıs 2020

Merhaba, karmaşık gelen kısmın tam olarak neresi olduğunu belirtebilir misiniz? Eğer mysql veritabanından verileri çekme kısmındaysa bunun için bir web servise ihtiyacınız bulunuyor. Bununla ilgili olarak şu videoya bakabilirsiniz; https://www.youtube.com/watch?v=pqEONSbXeSQ Spinner'da verileri listeleme kısmında sıkıntı yaşıyorsanız da şu makaleden faydalanabilirsiniz; https://www.geeksforgeeks.org/spinner-in-kotlin/ İyi çalışmalar.

M.K
mustafa kurt 20 Temmuz 2020

java kodlarını atma sansınız var mı

M.K
mustafa kurt 20 Temmuz 2020

java kodlarını atma sansınız var mı

Yusuf Borucu (Yazı sahibi)21 Temmuz 2020

Maalesef bu projeyi Kotlin ile yapmış olduğum için Java kodlarını atma şansım yok çünkü elimde şu an Java kodları yok :) Ancak bu projeyi Github'dan indirip Kotlin kodlarını Java'ya kendiniz çevirmeyi deneyebilirsiniz.

Yorum yap * E-posta adresiniz yayınlanmayacak.