ListView, dikey olarak kaydırılabilir öğelerin bir listesini görüntüleyen bir ViewGroup‘tur. Liste öğeleri, dizi veya veritabanı sorgusu gibi bir kaynağa bağlı bir bağdaştırıcı kullanılarak otomatik olarak listeye eklenir ve her öğe ListView‘de bir satıra dönüştürülür.
BaseAdapter
BaseAdapter, adından da anlaşılacağı gibi, Android’deki pek çok somut adaptör uygulaması için temel sınıftır. Soyuttur ve bu nedenle doğrudan somutlaştırılamaz.
Veri kaynağınız bir ArrayList veya dizi ise, alternatif olarak ArrayAdapter yapısını da kullanabiliriz. ArrayAdapter’ın kendisinin BaseAdapter’dan genişlediğini unutmayın.
BaseAdapter Kullanımı
BaseAdapter‘ı bir ListView ile kullanmak için, aşağıdaki metotları uygulayan BaseAdapter sınıfının somut bir uygulaması oluşturulmalıdır.
- int getCount()
- Object getItem(int position)
- long getItemId(int position)
- View getView(int position, View convertView, ViewGroup parent)
Özel BaseAdapter uygulamamızı oluşturmadan önce, ListView satırının düzenini ve ayrıca ListView‘deki öğeler için bir model oluşturmamız gerekiyor.
Model Sınıfı Oluşturma
ListView‘de her bir satır bir kişi öğesi içermektedir. u nedenle Model sınıfımız aşağıdaki gibidir.
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; } } |
Kisi.kt
1 2 3 | class Kisi(var isim: String, var resimID: Int, var dogum: String) |
Layout Oluşturma
Uygulamayı kullanan main_activity.xml ve listview_item XML dosyalarını aşağıdaki gibidir.
mian_activity.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> |
listview_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> |
Custom BaseAdapter Oluşturma
CustomListAdapter.kt
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 | import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ImageView import android.widget.TextView class CustomListAdapter ( private val context: Context, //list için veri kaynağı private val kisiler: ArrayList<Kisi>) : BaseAdapter() { override fun getCount(): Int { return kisiler.size } override fun getItem(i: Int): Any { return kisiler[i] } override fun getItemId(i: Int): Long { return i.toLong() } override fun getView(i: Int, convertView: View?, viewGroup:ViewGroup?): View? { var convertView: View? = convertView if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, viewGroup, false) } val mevcutKisi = getItem(i) as Kisi val tvAd = convertView!!.findViewById(R.id.tvAd) as TextView val tvDogum = convertView!!.findViewById(R.id.tvDogum) as TextView val profil = convertView!!.findViewById(R.id.profil) as ImageView tvAd.text = mevcutKisi.isim tvDogum.text = mevcutKisi.dogum profil.setImageResource(mevcutKisi.resimID) return convertView } } |
CustomListAdapter.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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; public class CustomListAdapter extends BaseAdapter { private Context context; private ArrayList<Kisi> items; public CustomListAdapter(Context context, ArrayList<Kisi> items) { this.context = context; this.items = items; } @Override public int getCount() { return items.size(); } @Override public Object getItem(int i) { return items.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { if (convertView == null) { convertView = LayoutInflater.from(context). inflate(R.layout.listview_item, viewGroup, false); } Kisi mevcutKisi = (Kisi) getItem(i); TextView tvAd = (TextView)convertView.findViewById(R.id.tvAd); TextView tvDogum = (TextView)convertView.findViewById(R.id.tvDogum); ImageView profil = (ImageView)convertView.findViewById(R.id.profil); tvAd.setText(mevcutKisi.getIsim()); tvDogum.setText(mevcutKisi.getDogum()); profil.setImageResource(mevcutKisi.getResimID()); return convertView; } } |
Custom Adapter Kullanma
Adapter(Bağdaştırıcı), gerekli parametrelerle somutlaştırılarak ve liste görünümünün bağdaştırıcısı olarak ayarlanarak basitçe kullanılabilir.
MainActivity.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 | import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Kisi kisi1 =new Kisi("Ahmet",R.drawable.res1,"1978.01.01"); Kisi kisi2 =new Kisi("Hayri",R.drawable.res1,"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"); ArrayList<Kisi> kisiler = new ArrayList<Kisi>(); kisiler.add(kisi1); kisiler.add(kisi2); kisiler.add(kisi3); kisiler.add(kisi4); kisiler.add(kisi5); // Özel Adapter Sınıfını bağlama ListView listView=(ListView)findViewById(R.id.listViewKisiler); CustomListAdapter adapter = new CustomListAdapter(this, kisiler); // ListView'e Adapterı ekleme listView.setAdapter(adapter); } } |
MainActivity.kt
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 | import android.os.Bundle import android.util.Log import android.view.View import android.widget.ListView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { lateinit var listview: ListView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.v("TAG", "index=") setContentView(R.layout.activity_main) title = "TasarımKodlama.Com" val listView = findViewById<View>(R.id.listViewKisiler) as ListView val kisi1 = Kisi("Ahmet", R.drawable.res1, "1978.01.01") val kisi2 = Kisi("Hayri", R.drawable.res2, "1983.02.02") val kisi3 = Kisi("Hüseyin", R.drawable.res3, "1984.04.04") val kisi4 = Kisi("Ayşe", R.drawable.res4, "1980.06.06") val kisi5 = Kisi("Fatma", R.drawable.res5, "1988.05.05") val kisiler = ArrayList<Kisi>() kisiler.add(kisi1) kisiler.add(kisi2) kisiler.add(kisi3) kisiler.add(kisi4) kisiler.add(kisi5) // Özel Adapter val adapter = CustomListAdapter(this, kisiler) // ListView'e Adapterı ekleme listView.adapter=adapter } } |
ListView Optimizasyonu
Liste görünümünün performansını optimize etmek için, yeni bir satır düzeni yalnızca convertView == null olduğunda şişirilmelidir. Bunun nedeni, liste görünümünün ekranda yeni bir satır göstermesi gerektiğinde adaptörün getView yönteminin çağrılmasıdır. convertView bu süreçte geri dönüştürülür. Bu nedenle, convertView == null olduğunda satır düzeni yalnızca bir kez şişirilmelidir ve her çağrıda çok pahalı olan yeni bir satırı şişirmek yerine, sonraki getView çağrılarında içeriği güncellenmelidir.











Yorum Yap