Bu yazıda, Android Java kullanarak bir ListView
bileşeni ile ülkeleri listeleyen ve üzerine tıklanınca detay sayfasına geçen bir uygulamayı adım adım inceleyeceğiz. Her ülkenin bayrağı, adı, başkenti, nüfusu ve açıklaması bulunmaktadır. Bu veriler özel bir Ulke
sınıfı ile temsil edilir ve BaseAdapter
ile listede gösterilir.
Uygulama bittiği zaman Klasör yapısı aşağıdaki gibi olacaktır.

Tasarım
activity_main.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 | <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/lv_ulkeler" android:layout_width="409dp" android:layout_height="729dp" android:layout_marginStart="32dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:divider="@android:color/transparent" android:dividerHeight="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |

satir.xml
Layout klasörü üzerinde sağ tıklayarak New->layout Resource File seçilerek satir.xml dosyası oluşturulur.
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 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/iv_satir_bayrak" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:adjustViewBounds="true" app:srcCompat="@drawable/abd" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:orientation="vertical" android:paddingLeft="8dp" android:gravity="center_vertical"> <TextView android:id="@+id/tv_satir_ad" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ABD" android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_satir_baskent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginVertical="10dp" android:text="Washington" android:textSize="14sp" /> <TextView android:id="@+id/tv_satir_nufus" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Nüfus: 100.000.000" android:textSize="14sp" /> </LinearLayout> </LinearLayout> |

activity_detail.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 40 41 42 | <androidx.constraintlayout.widget.ConstraintLayout ...> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/iv_bayrak" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp" app:srcCompat="@drawable/abd" /> <TextView android:id="@+id/tv_ulke" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp" android:text="Ülke" android:textSize="24sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_aciklama" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="24dp" android:text="TextView" android:textAlignment="textStart" /> </LinearLayout> </ScrollView> </androidx.constraintlayout.widget.ConstraintLayout> |

Ulke Sınıfı (Model)
İlk olarak verilerimizi temsil edecek olan Ulke
sınıfını oluşturalım.
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 | package com.example.baseadapterornek; import java.io.Serializable; public class Ulke implements Serializable { int bayrak; String ad; String baskent; int nufus; String aciklama; public Ulke(int bayrak, String ad, String baskent, int nufus, String aciklama) { this.bayrak = bayrak; this.ad = ad; this.baskent = baskent; this.nufus = nufus; this.aciklama = aciklama; } public int getBayrak() { return bayrak; } public void setBayrak(int bayrak) { this.bayrak = bayrak; } public String getAd() { return ad; } public void setAd(String ad) { this.ad = ad; } public String getBaskent() { return baskent; } public void setBaskent(String baskent) { this.baskent = baskent; } public int getNufus() { return nufus; } public void setNufus(int nufus) { this.nufus = nufus; } public String getAciklama() { return aciklama; } public void setAciklama(String aciklama) { this.aciklama = aciklama; } } |
Serializable
arayüzü sayesinde bu nesneyi başka Activity’e gönderebiliyoruz.
UlkeAdapter (Özel Liste Adaptörü)
ListView içinde özel görünümlerle veri göstermek için BaseAdapter
sınıfından türettiğimiz bir adaptör yazıyoruz.
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 | package com.example.baseadapterornek; import android.content.Context; 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 UlkeAdapter extends BaseAdapter { Context context; ArrayList<Ulke> ulkeler; public UlkeAdapter(Context context, ArrayList<Ulke> ulkeler) { this.context = context; this.ulkeler = ulkeler; } @Override public int getCount() { return ulkeler.size(); } @Override public Object getItem(int i) { return ulkeler.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ImageView ivSatirBayrak; TextView tvSatirAd, tvSatirNufus, tvSatirBaskent; Ulke ulke = ulkeler.get(i); if(view == null){ view = View.inflate(context, R.layout.satir, null); } ivSatirBayrak = view.findViewById(R.id.iv_satir_bayrak); tvSatirAd = view.findViewById(R.id.tv_satir_ad); tvSatirBaskent = view.findViewById(R.id.tv_satir_baskent); tvSatirNufus = view.findViewById(R.id.tv_satir_nufus); ivSatirBayrak.setImageResource(ulke.getBayrak()); tvSatirAd.setText(ulke.getAd()); tvSatirBaskent.setText(ulke.getBaskent()); tvSatirNufus.setText("Nüfus: " + ulke.getNufus()); return view; } } |
getView()
metodunda her bir satır görünümünü oluşturuyoruz.
MainActivity.java (Ana Sayfa)
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 | package com.example.baseadapterornek; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ListView lvUlkeler; ArrayList<Ulke> liste; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); lvUlkeler = findViewById(R.id.lv_ulkeler); liste = new ArrayList<>(); liste.add(new Ulke(R.drawable.turkiye, "Türkiye", "Ankara", 25000000, getString(R.string.tr_aciklama))); liste.add(new Ulke(R.drawable.almanya, "Almanya", "Berlin", 80000000, getString(R.string.almanya_aciklama))); liste.add(new Ulke(R.drawable.arjantin, "Arjantin", "Buenos Aires", 45000000, getString(R.string.arjantin_aciklama))); liste.add(new Ulke(R.drawable.isvicre, "İsviçre", "Berlin", 45000000, getString(R.string.isvicre_aciklama))); UlkeAdapter adapter = new UlkeAdapter(this, liste); lvUlkeler.setAdapter(adapter); lvUlkeler.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Ulke secilenUlke = liste.get(i); Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.putExtra("secilen", secilenUlke); startActivity(intent); } }); } } |
Listeye tıklanınca detay sayfasına Intent
ile Ulke
nesnesini gönderiyoruz.
DetailActivity.java (Detay Sayfası)
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 | package com.example.baseadapterornek; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; public class DetailActivity extends AppCompatActivity { ImageView ivBayrak; TextView tvUlke, tvAciklama; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_detail); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); ivBayrak = findViewById(R.id.iv_bayrak); tvUlke = findViewById(R.id.tv_ulke); tvAciklama = findViewById(R.id.tv_aciklama); Ulke ulke = (Ulke) getIntent().getSerializableExtra("secilen"); if (ulke != null) { ivBayrak.setImageResource(ulke.getBayrak()); tvUlke.setText(ulke.getAd()); tvAciklama.setText(ulke.getAciklama()); } } } |
Bu örnek uygulamada, Android’de özel BaseAdapter
kullanarak listeleme yapmayı ve Intent
ile detay ekranına veri geçişini gördük. Bu yapı, farklı veri modelleriyle uyarlanabilir ve ListView veya RecyclerView gibi kontrollerle genişletilebilir.
Ekran Görüntüleri:
Anasayfa

Detay Sayfası

Kullanılan Kaynaklar (Resources)
- Drawable klasörü:
turkiye.png
,almanya.png
,arjantin.png
,isvicre.png
- strings.xml içinde açıklamalar:
1 2 3 4 5 6 | <string name="tr_aciklama">Türkiye hakkında detaylı açıklama...</string> <string name="almanya_aciklama">Almanya hakkında detaylı açıklama...</string> <string name="arjantin_aciklama">Arjantin hakkında detaylı açıklama...</string> <string name="isvicre_aciklama">İsviçre hakkında detaylı açıklama...</string> |