Adapter nesnesi, bir AdapterView ile bu görünüm için temel alınan veriler arasında bir köprü görevi görür. Adapter, veri öğelerine erişim sağlar. Adapter, veri kümesindeki her öğe için bir View oluşturmaktan da sorumludur.
AdapterView, bir bağdaştırıcıya yüklenen öğeleri görüntüleyen bir ViewGroup'tur. En yaygın bağdaştırıcı türü, dizi tabanlı bir veri kaynağından gelir.
Adapter
ve Adapter View
o kadar popülerdir ki, List öğeleri veya GridView öğeleri olan herhangi bir uygulamayı her gördüğünüzde, onun Adapter ve Adapter View kullandığını kesin olarak söyleyebilirsiniz.
Genel olarak, herhangi bir List veya GridView oluşturduğumuzda, veriler üzerinde yineleme yapmak için bir döngü kullanabileceğimizi ve ardından verileri list veya gridview oluşturmak için ayarlayabileceğimizi düşünüyoruz.
Ancak ya veriler 1 milyon üründen oluşan bir setse. O zaman bir döngü kullanmak sadece çok fazla zaman harcamakla kalmaz, uygulamayı yavaşlatır, ayrıca tüm çalışma zamanı belleğini tüketebilir.
Tüm bu sorunlar Adapter
ve Adapter View
kullanılarak çözülür.
Adapter View, bir View nesnesidir ve tıpkı diğer herhangi bir arabirim widget’ını kullandığımız gibi kullanılabilir. Buradaki tek olay, kendi başına veri gösteremediğinden, kendisine içerik sağlamak için bir Adapter‘a ihtiyaç duymasıdır.
Adapter Nedir?
Adapter, veri kaynağı ile kullanıcı arabirimi arasında bir köprü görevi görür. Çeşitli veri kaynaklarından verileri okur, bunları View nesnelerine dönüştürür ve UI bileşenleri oluşturmak için bağlantılı Adaptör görünümüne sağlar.
Veri kaynağı veya veri kümesi bir Array nesnesi, bir List nesnesi vb. olabilir.
Diğer tüm bağdaştırıcı sınıflarının üst sınıfı olan BaseAdapter sınıfını genişleterek kendi Adapter sınıfınızı oluşturabilirsiniz. Android SDK ayrıca ArrayAdapter, SimpleAdapter vb. gibi bazı kullanıma hazır adaptör sınıfları sağlar.
Adapter View Nedir?
Bir Adapter View, bir Adapter tarafından kendisine sağlanan List veya Grid vb. biçimindeki büyük veri kümelerini verimli bir şekilde görüntülemek için kullanılabilir.
Verimli dediğimizde ne demek istiyoruz?
Adapter View, bellek ve CPU kullanımını çok düşük tutarken ve fark edilir bir gecikme olmadan Kullanıcı Arayüzünde milyonlarca öğe görüntüleme yeteneğine sahiptir. Farklı Bağdaştırıcılar bunun için farklı stratejiler izler, ancak Android SDK’da sağlanan varsayılan Adapter aşağıdaki püf noktalarını izler:
- Yalnızca o anda ekranda olan veya ekranda olmak üzere olan View nesnelerini işler. Bu nedenle, veri kümeniz ne kadar büyük olursa olsun, Adapter View, ekran boyutuna bağlı olarak her zaman yalnızca 5 veya 6 veya belki 7 öğe yükleyecektir. Bu nedenle bellek tasarrufu sağlar.
- Ayrıca, kullanıcı kaydırdıkça veri öğelerini doldurmak için önceden oluşturulmuş düzeni yeniden kullanır, dolayısıyla CPU kullanımından tasarruf sağlar.
Aşağıdaki içeriğe sahip bir String dizisi gibi bir veri kümeniz olduğunu varsayalım.
1 2 3 |
String gunler[] = {"Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"}; |
Şimdi, bir Adapter’ın yaptığı şey, bu diziden verileri alıp bu verilerden bir Görünüm oluşturması ve ardından bu Görünümü bir AdapterView’a vermesidir. AdapterView daha sonra verileri istediğiniz şekilde görüntüler.
Not: Adapter yalnızca verileri bir veri kaynağından alıp View’e dönüştürmekten ve ardından Adapter View’e iletmekten sorumludur. Böylece verileri yönetmek için kullanılır. AdapterView, verilerin görüntülenmesinden sorumludur.
Bu nedenle, verileri bir veritabanından veya ArrayList’ten veya başka bir veri kaynağından alabilir ve ardından bu verileri herhangi bir düzenlemede görüntüleyebilirsiniz. Dikey olarak (ListView) veya satır ve sütunlarda (GridView) veya açılır menüde (Spinners) vb. görüntüleyebilirsiniz.
Farklı AdapterView türleri vardır. Bunlardan bazılarına bir göz atalım:
ListView
Her görünümün listedeki bir önceki görünümün hemen altına yerleştirildiği dikey olarak kaydırılabilir bir görünüm koleksiyonu görüntüler.
GridView
GridView, öğeleri iki boyutlu, kaydırılabilir bir ızgarada görüntüleyen bir ViewGroup’tur.
Spinner
Spinner, bir dizi değerden bir değer seçmenin hızlı bir yolunu sağlar. Spinnere dokunmak, kullanıcının yeni bir tane seçebileceği diğer tüm mevcut değerleri içeren bir açılır menü görüntüler.
Her AdapterView, Adapter‘ı kullanmak için bazı yaklaşımlar kullanır. Bu yaklaşımı ilgili AdapterView eğitimlerinde tartışacağız. Ancak basit bir şekilde ArrayAdapter ve BaseAdapter kavramlarına değinip birer tane örnek verelim.
Adapter
Array Adapter
Bir array tarafından desteklenen tek bir öğe listeniz olduğunda, ArrayAdapter’ı kullanabilirsiniz. Örneğin, telefon kişileri, ülkeler veya adların listesi.
Önemli Not: Varsayılan olarak, ArrayAdapter tek bir TextView ile bir Layout bekler, Daha karmaşık görünümler kullanmak istiyorsanız, liste öğelerinde daha fazla özelleştirme anlamına gelir, lütfen ArrayAdapter’dan kaçının ve özel adaptörler kullanın.
Array Adapter kodu aşağıdadır:
1 2 3 |
ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.ListView,R.id.textView,StringArray); |
Array Adapter Örnek Uygulama:
Aşağıdaki örnekte haftanın günlerini bir ListView içinde göstermeyi hedefliyoruz. ListView içinde sadece günler olacağı için adatörü Array Adapter olarak seçiyoruz. Aşağıdaki adımları izleyerek örneği hazırlayalım.
Adım 1: İlk olarak ListView içinde kullanacağımız şablonu oluşturuyoruz. activity_listview.xml isimli bir tane düzen oluşturup aşağıdaki kodları yazın. @id değeri textView olan bir tane TextView nesnesi ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dp" android:text="14dp" android:textColor="@color/black" /> </LinearLayout> |
Adım 2: activity_main.xml dosyasını açıp aşağıdaki gibi düzenleyin. @id değeri listView olan bir tane ListView nesnesi ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id = "@+id/mainLayout" 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 = "match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/black" android:dividerHeight="1dp"/> </RelativeLayout> |
Adım 3: Şimdi bu son adımda, ülke adlarını kullanıcı arayüzünde görüntülemek için ArrayAdapter kullanacağız. MainActivity.java kodu aşağıdadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.example.tasarimkodlama; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity { ListView listView; String gunler[] = {"Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView)findViewById(R.id.listView); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_listview, R.id.textView, gunler); listView.setAdapter(arrayAdapter); } } |
Array Adapter ile Custom Adapter kullanan ListView Örneği
Bu örnekte profil resimlerine sahip kişileri isimleri ile listeleyen özel bir adapter kullanacağız.
Adım 1: Yeni bir android projesi oluşturun. Burada LinearLayout‘ta bir ListView oluşturacağız. activity_main.xml
veya list_item.xml
düzenleri ve kodları aşağıdadır.
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id = "@+id/mainLayout" 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 = "match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/listViewKisiler" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/black" android:dividerHeight="1dp" /> </LinearLayout> |
list_item.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="8dp"> <ImageView android:id="@+id/profil" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/ic_launcher_foreground" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tvAd" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="İsim" android:layout_margin="10dp" android:textSize="30dp" android:textColor="@color/black" /> <TextView android:id="@+id/tvDogum" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="yyyy.aa.gg" android:layout_margin="5dp" android:textSize="15dp" android:textColor="@color/teal_700" /> </LinearLayout> </LinearLayout> |
list_item.xml düzeni aşağıdaki gibi oluşacaktır.
Kişi bilgilerini tutmak için Kisi adında bir tane Java sınıfı oluşturuyoruz. Bu sınıfı kullanarak örnek kişileri tutan bir adapter oluşturacağız.
Kisi.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.example.tasarimkodlama; public class Kisi { private String isim; private int resimID; private String dogum; public Kisi(String isim, int resimID, String dogum) { this.isim = isim; this.resimID = resimID; this.dogum = dogum; } public String getIsim() { return isim; } public void setIsim(String isim) { this.isim = isim; } public int getResimID() { return resimID; } public void setResimID(int resimID) { this.resimID = resimID; } public String getDogum() { return dogum; } public void setDogum(String dogum) { this.dogum = dogum; } } |
Adım 3: Üçüncü adımda, MainActivity.java‘yı kodlayarak üye adlarını kullanıcı arayüzünde görüntülemek için özel adaptör kullanacağız. MainActivity.java kodu aşağıdadır.
Önemli Not: Üye resimlerinin res klasörünün içinde bulunan drawable klasörde doğru adlandırma ile saklandığından emin olun.
MainActivity içindeki onCreate() metodu içine aşağıdaki kodları ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ListView lv=(ListView)findViewById(R.id.listViewKisiler); Kisi kisi1 =new Kisi("Ahmet",R.drawable.res1,"1978.01.01"); Kisi kisi2 =new Kisi("Hayri",R.drawable.res2,"1983.02.02"); Kisi kisi3 =new Kisi("Hüseyin",R.drawable.res3,"1984.04.04"); Kisi kisi4 =new Kisi("Ayşe",R.drawable.res4,"1980.06.06"); Kisi kisi5 =new Kisi("Fatma",R.drawable.res5,"1988.05.05"); Kisi kisi6 =new Kisi("Ufuk",R.drawable.res6,"1990.08.08"); ArrayList<Kisi> kisiler = new ArrayList<Kisi>(); kisiler.add(kisi1); kisiler.add(kisi2); kisiler.add(kisi3); kisiler.add(kisi4); kisiler.add(kisi5); kisiler.add(kisi6); CustomAdapter customAdapter = new CustomAdapter(this,R.layout.list_item,kisiler); lv.setAdapter(customAdapter); |
Yukarıda yapılanları inceleyelim. İlk olarak findViewById() metodu ile ListView kontrolünün bir örneğini aldık. Ardından 6 tane kişi oluşturup bunları ArrayList koleksiyonuna ekledik. Sondaki satırda ArrayAdapter sınıfını miras alan CustomAdapter sınıfını oluşturup bunu listView’e adapter olarak tanımladık.
Adım 4: Şimdi ArrayAdapter‘ı genişletecek başka bir Custom Adapter sınıfı oluşturacağız. CustomAdapter.java kodu aşağıdadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package com.example.tasarimkodlama; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class CustomAdapter extends ArrayAdapter<Kisi> { private Context context; int res; public CustomAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Kisi> objects) { super(context, resource, objects); this.context = context; this.res= resource; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { //return super.getView(position, convertView, parent); //kisi bilgileri getir String isim = getItem(position).getIsim(); int resimID = getItem(position).getResimID(); String dogum = getItem(position).getDogum(); //Bilgileri ile birlikte yeni bir kişi oluşturun Kisi kisi= new Kisi(isim,resimID,dogum); Log.d("Custom",Integer.toString(resimID)); LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(res,parent,false); TextView tvAd = convertView.findViewById(R.id.tvAd); TextView tvDogum = convertView.findViewById(R.id.tvDogum); ImageView profil = convertView.findViewById(R.id.profil); tvAd.setText(isim); tvDogum.setText(dogum); profil.setImageResource(resimID); return convertView; } } |
Şimdi Uygulamayı Emulator’da çalıştırın ve size kullanıcıların resimleri ile birlikte isimler ve doğum tarihlerini gösteren ListView örneği gösterilecektir.
Base Adapter
BaseAdapter, ListView‘de kullanılabilen bir Adapterın genel uygulamasının ortak bir temel sınıfıdır. Ne zaman özelleştirilmiş bir listeye ihtiyaç duyarsanız, kendi bağdaştırıcınızı yaratır ve bunun içindeki temel bağdaştırıcıyı genişletirsiniz. Temel Adapter, özel bir liste öğesini görüntülemek için özel bir Adapter oluşturmak üzere genişletilebilir. ArrayAdapter ayrıca BaseAdapter‘ın bir implimentasyonudur.
Yukarıdaki ArrayAdapter örneğine benzer şekilde bu adımlarda da BaseAdapter ile yukarıdaki örneği nasıl yapacağınızı göstereceğim. Bu yüzden yukarıdaki adımlara benzer şekilde aşağıdaki adımları gerçekleştireceğiz.
Adım 1: Yeni bir android projesi oluşturun. Burada LinearLayout‘ta bir ListView oluşturacağız. activity_main.xml
veya list_item.xml
düzenleri ve kodları aşağıdadır.
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id = "@+id/mainLayout" 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 = "match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/listViewKisiler" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/black" android:dividerHeight="1dp" /> </LinearLayout> |
list_item.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="8dp"> <ImageView android:id="@+id/profil" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/ic_launcher_foreground" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tvAd" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="İsim" android:layout_margin="10dp" android:textSize="30dp" android:textColor="@color/black" /> <TextView android:id="@+id/tvDogum" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="yyyy.aa.gg" android:layout_margin="5dp" android:textSize="15dp" android:textColor="@color/teal_700" /> </LinearLayout> </LinearLayout> |
list_item.xml düzeni aşağıdaki gibi oluşacaktır.
Kişi bilgilerini tutmak için Kisi adında bir tane Java sınıfı oluşturuyoruz. Bu sınıfı kullanarak örnek kişileri tutan bir adapter oluşturacağız.
Kisi.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.example.tasarimkodlama; public class Kisi { private String isim; private int resimID; private String dogum; public Kisi(String isim, int resimID, String dogum) { this.isim = isim; this.resimID = resimID; this.dogum = dogum; } public String getIsim() { return isim; } public void setIsim(String isim) { this.isim = isim; } public int getResimID() { return resimID; } public void setResimID(int resimID) { this.resimID = resimID; } public String getDogum() { return dogum; } public void setDogum(String dogum) { this.dogum = dogum; } } |
Adım 3: Üçüncü adımda, MainActivity.java‘yı kodlayarak üye adlarını kullanıcı arayüzünde görüntülemek için özel adaptör kullanacağız. MainActivity.java kodu aşağıdadır.
Önemli Not: Üye resimlerinin res klasörünün içinde bulunan drawable klasörde doğru adlandırma ile saklandığından emin olun.
MainActivity içindeki onCreate() metodu içine aşağıdaki kodları ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ListView listView=(ListView)findViewById(R.id.listViewKisiler); Kisi kisi1 =new Kisi("Ahmet",R.drawable.res1,"1978.01.01"); Kisi kisi2 =new Kisi("Hayri",R.drawable.res2,"1983.02.02"); Kisi kisi3 =new Kisi("Hüseyin",R.drawable.res3,"1984.04.04"); Kisi kisi4 =new Kisi("Ayşe",R.drawable.res4,"1980.06.06"); Kisi kisi5 =new Kisi("Fatma",R.drawable.res5,"1988.05.05"); Kisi kisi6 =new Kisi("Ufuk",R.drawable.res6,"1990.08.08"); ArrayList<Kisi> kisiler = new ArrayList<Kisi>(); kisiler.add(kisi1); kisiler.add(kisi2); kisiler.add(kisi3); kisiler.add(kisi4); kisiler.add(kisi5); kisiler.add(kisi6); // Özel Adapter CustomAdapter adapter = new CustomAdapter(this, kisiler); // ListView'e Adapterı ekleme listView.setAdapter(adapter); |
Adım 4: Şimdi ArrayAdapter‘ı genişletecek başka bir Custom Adapter sınıfı oluşturacağız. CustomAdapter.java kodu aşağıdadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
package com.example.tasarimkodlama; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class CustomAdapter extends BaseAdapter{ private Context context; //context private ArrayList<Kisi> kisiler; //list için veri kaynağı //public constructor public CustomAdapter(Context context, ArrayList<Kisi> kisiler) { this.context = context; this.kisiler = kisiler; } @Override public int getCount() { return kisiler.size(); } @Override public Object getItem(int i) { return kisiler.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { // inflate the layout for each list row if (view == null) { view = LayoutInflater.from(context). inflate(R.layout.list_item, viewGroup, false); } Kisi mevcutKisi = (Kisi) getItem(i); TextView tvAd = (TextView)view.findViewById(R.id.tvAd); TextView tvDogum = (TextView)view.findViewById(R.id.tvDogum); ImageView profil = (ImageView)view.findViewById(R.id.profil); tvAd.setText(mevcutKisi.getIsim()); tvDogum.setText(mevcutKisi.getDogum()); profil.setImageResource(mevcutKisi.getResimID()); return view; } } |
Şimdi Uygulamayı Emulator’da çalıştırın ve size kullanıcıların resimleri ile birlikte isimler ve doğum tarihlerini gösteren ListView örneği gösterilecektir.
Bu yazıda ArrayAdapter ve BaseAdapter sınıflarını kullanarak bir ListView öğesini nasıl dolduracağımız örneklerle gördük.
Daha fazla Android içeriği için Android Dersleri yazısını inceleyebilirsiniz.
3 Yorum