ListView: bu nədir, Android tətbiqlərində sadə siyahılar

Müəllif: IT Sectr Dərc olunub: 2026-02-23 Oxuma vaxtı: 8 dəq

ListView — API 1-dən (Android 1.0) etibarən mövcud olan, şaquli siyahıları göstərmək üçün əsas Android komponenti. ListView ArrayAdapter vasitəsilə elementlərdən siyahı yaradır və fərdi xana maketlərini dəstəkləyir. ListView-in nə olduğunu, onu necə konfiqurasiya etməyi və bu köhnə, lakin hələ də istifadə olunan komponentin hansı tələləri gizlətdiyini öyrənirik. IT Sectr-də biz ListView-i legacy-layihələrdə qarşılayırıq və Android 4.4 ilə geriyə uyğunluğu dəstəkləyirik. Müasir alternativlə müqayisə üçün RecyclerView haqqında məqaləni oxuyun.

Əsas məqamlar

  • ListView — Android 1.0-dan etibarən şaquli siyahılar üçün Android SDK-ya daxil olan komponent.
  • ArrayAdapter — toString() və ya fərdi maket vasitəsilə məlumat massivini ListView-ə bağlamaq üçün standart adapter.
  • SimpleAdapter — ViewModel olmadan sadə ekranlar üçün əlverişli olan Map-məlumatlardan siyahılar üçün adapter.
  • onItemClickListener — adapterdə əlavə tətbiq tələb etməyən daxili klik idarəedici.
  • convertView — proqramçının əl ilə tətbiq etməli olduğu ListView-də View-in təkrar istifadə mexanizmi (ViewHolder analoqu).

Android-də ListView nədir?

ListView — android.widget paketindən olan, sürüşdürülə bilən element siyahısını göstərmək üçün nəzərdə tutulmuş View qrupudur. ListView AdapterView nümunəsini tətbiq edir: məlumatlar adapter (Adapter) vasitəsilə ötürülür, o da məlumat elementlərini ekranda göstərilən View-ə çevirir. ListView Android SDK-da ilk versiyadan (API 1) mövcuddur və əlavə kitabxanalar tələb etmir.

Arxitektura ListView RecyclerView-dən daha sadədir: LayoutManager daxilidir (yalnız şaquli sürüşdürmə), dəyişiklik animasiyası yoxdur, ayırıcılar android:divider XML atributu vasitəsilə təyin edilir. ListView avtomatik olaraq OverScrollView və fokusda vurğulama əlavə edir ki, bu da prototipləməni asanlaşdırır. Statista (2025) məlumatlarına görə, Play Store top-100-dəki Android tətbiqlərinin təxminən 15%-i hələ də ListView ehtiva edir — əsasən minimal dəstəkli legacy-layihələr.

Tarix və aktuallıq

ListView 2008-ci ildən 2014-cü ilə qədər Android-də siyahıların əsas komponenti idi, Google I/O 2014-də RecyclerView təqdim edildi. Qismən köhnəlmiş (soft-deprecated) statusuna baxmayaraq, ListView Android-in bütün versiyalarında mövcud qalır və SDK API 35-də @Deprecated kimi qeyd olunmayıb. Layihəniz Android 4.4 (API 19) və daha aşağı versiyaları dəstəkləyirsə, ListView yeganə daxili seçimdir, çünki RecyclerView AndroidX və gradle asılılıqları tələb edir.

Adapter növləri: ArrayAdapter və SimpleAdapter

ArrayAdapter — ListView üçün ən populyar adapter. O, List<T> və hər element üçün maket qəbul edir. Varsayılan olaraq ArrayAdapter hər obyekt üçün toString() çağırır və mətni simple_list_item_1-də (bir TextView) göstərir. Fərdi göstərmək üçün getView()-i yenidən təyin etmək və ya konstruktorda fərdi maket ötürmək lazımdır.

kotlin
// ArrayAdapter ilə ListView (sadə mətn)
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val countries = listOf(
        "Rusiya", "ABŞ", "Almaniya",
        "Fransa", "Yaponiya", "Çin", "Braziliya"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val adapter = ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            countries
        )
        binding.listView.adapter = adapter

        // Klikin idarə edilməsi
        binding.listView.onItemClickListener =
            AdapterView.OnItemClickListener { _, _, position, _ ->
                Toast.makeText(this, countries[position], Toast.LENGTH_SHORT).show()
            }
    }
}

SimpleAdapter Map-məlumatlardan siyahılar üçün nəzərdə tutulub. O, List<Map<String, Any>> və Map açarlarını maketdəki vidjetlərin ID-ləri ilə bağlamaq üçün from/to massivi qəbul edir. SimpleAdapter ayrıca adapter sinfi tələb olunmayan sürətli prototiplər üçün əlverişlidir. Çatışmazlıqlar: type-safe tipizasiyanın olmaması və fərdi məntiqlə çətinlik.

xml
<!-- ListView ilə maket -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/divider"
        android:dividerHeight="1px"
        android:scrollbars="vertical" />
</LinearLayout>

ViewHolder ilə fərdi adapterin yaradılması

Fərdi adapter ListView üçün getView() metodunu yenidən təyin edir ki, RecyclerView bunu onCreateViewHolder + onBindViewHolder-ə bölür. ListView-də hər iki addım birləşdirilib, ona görə də proqramçı ViewHolder nümunəsini convertView (təkrar istifadə olunan View) və setTag() teqi vasitəsilə müstəqil tətbiq etməlidir.

kotlin
// Məlumat modeli
data class Product(
    name: String,
    price: String,
    imageResId: Int
)

// ViewHolder ilə fərdi adapter
class ProductAdapter(
    context: Context,
    private val products: List<Product>
) : ArrayAdapter<Product>(context, 0, products) {

    // Keshləmə üçün ViewHolder
    private class ViewHolder(view: View) {
        val nameText: TextView = view.findViewById(R.id.tvName)
        val priceText: TextView = view.findViewById(R.id.tvPrice)
        val imageView: ImageView = view.findViewById(R.id.ivProduct)
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = convertView ?: LayoutInflater.from(context)
            .inflate(R.layout.item_product, parent, false)
            .also { it.tag = ViewHolder(it) }

        val holder = view.tag as ViewHolder
        val product = getItem(position)

        holder.nameText.text = product.name
        holder.priceText.text = product.price
        holder.imageView.setImageResource(product.imageResId)

        return view
    }
}

RecyclerView-dən əsas fərq: ListView-də getView() metodu elementin ekranda hər görünməsində çağırılır. Əgər convertView və ViewHolder istifadə etmirsinizsə, hər sürüşdürmə yeni View obyekti yaradır ki, bu da yaddaş sızmasına və 50+ elementli siyahılarda ləngimələrə səbəb olur. ViewHolder view.tag ilə — fərdi maketli ListView üçün məcburi optimallaşdırmadır.

ListView-in məhdudiyyətləri: Google nə üçün RecyclerView-i tövsiyə edir

ListView-in Google-un RecyclerView-də düzəltdiyi dörd arxitektura məhdudiyyəti var: (1) yalnız şaquli oriyentasiya — şəbəkələr, üfüqi siyahılar və ya kaskadlar yoxdur; (2) nöqtəvi bildirişlərin olmaması — hər hansı məlumat dəyişikliyi notifyDataSetChanged() vasitəsilə tam yenidən çəkməyə səbəb olur, bu da titrəmələr yaradır; (3) elementlərin əlavə edilməsi/silinməsi üçün daxili animasiyanın olmaması; (4) məsuliyyətlərin bölünməməsi — LayoutManager daxilidir, ItemAnimator mövcud deyil.

xml
<!-- item_product.xml — ListView elementinin maketi -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="12dp">

    <ImageView
        android:id="@+id/ivProduct"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:scaleType="centerCrop" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:paddingStart="12dp">

        <TextView
            android:id="@+id/tvName"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tvPrice"
            android:textSize="14sp"
            android:textColor="@color/price" />
    </LinearLayout>
</LinearLayout>

Praktik nəticələr: 20 elementə qədər siyahılarda ListView RecyclerView qədər sürətlidir. 100+ elementdə fərq nəzərə çarpır: ListView diff-hesablamalarının olmaması və məcburi ViewHolder səbəbindən FPS itirməyə başlayır. Tez-tez yenilənən siyahılar (chat, feed, loglar) üçün ListView uyğun deyil — Paging 3 ilə RecyclerView istifadə edin. IT Sectr-də biz 50-dən çox elementi olan legacy-ekranlar üzərində hər hansı iş zamanı ListView-i RecyclerView-ə miqrasiya edirik.

ListView-in XML atributları vasitəsilə konfiqurasiyası

ListView kod olmadan sürətli konfiqurasiya üçün XML atributları dəsti təqdim edir: android:divider (ayırıcının rəngi/şəkli), android:dividerHeight (qalınlıq), android:scrollbars (sürüşdürmə zolaqları), android:fastScrollEnabled (tutacaqla sürətli sürüşdürmə), android:choiceMode (seçim rejimi: singleChoice, multipleChoice). android:entries atributu adapter olmadan siyahını resurs massivindən (string-array) doldurmağa imkan verir.

AtributAçıqlamaNümunə dəyər
android:dividerAyırıcının rəngi və ya drawable@color/gray_light
android:dividerHeightAyırıcının qalınlığı px/dp ilə1dp
android:entriesResurslardan sətirlər massivi@array/countries
android:choiceModeElement seçim rejimisingleChoice
android:fastScrollEnabledSürətli sürüşdürmətrue
android:overlapAnchorAçılan siyahılar üçün lövbər (API 21+)true

Seçim rejimi: choiceMode="singleChoice" RadioButton stilini aktivləşdirir, burada seçilmiş element vurğulanır. choiceMode="multipleChoice" — çoxlu elementlər üçün qeyd xanaları. Seçim məlumatları listView.checkedItemPosition və ya listView.checkedItemIds vasitəsilə əldə edilir. Vacibdir: choiceMode zamanı ListView fon üçün StateListDrawable istifadə edir — standart mavi dizayna uyğun gəlmirsə, öz seçiciyi təyin edin.

ListView vs RecyclerView: imkanların müqayisəsi

Seçim ListView və RecyclerView arasında layihə tələblərindən asılıdır. RecyclerView müasir standartdır, lakin ListView köhnə kodun saxlanmasına minimal xərcləri olan sadə ekranlar üçün əsaslandırıla bilər. Bütün əsas parametrlər üzrə müqayisə:

ParametrListViewRecyclerView
Kitabxana ölçüsüSDK-ya daxildir (≈60 KB)AndroidX (asılılıqlarla ≈300 KB)
Minimal versiyaAPI 1API 14 (AndroidX vasitəsilə)
OrientasiyaYalnız şaquliŞaquli, üfüqi, şəbəkə, kaskad
ViewHolderƏl ilə tətbiqArxitektura üzrə məcburi
AnimasiyaYalnız fade keçidləriDefaultItemAnimator (add, remove, move, change)
Nöqtəvi yeniləmələrYox (yalnız notifyDataSetChanged)notifyItemInserted/Removed/Changed
Click listeneronItemClickListener (daxili)ViewHolder vasitəsilə (daxili yoxdur)
Performans50 elementə qədər siyahılar üçün kifayətdir1000+ element üçün stabildir 60 FPS

Nəticə: yeni layihələr üçün RecyclerView istifadə edin. ListView-i yalnız miqrasiyanın əsassız baha olduğu legacy-koddda buraxın. Material Design 3 (2026) təlimatlarına görə, istənilən mürəkkəblikdə siyahılar müasir performans və əlçatanlıq standartlarına uyğun olmaq üçün RecyclerView istifadə etməlidir.

Tez-tez verilən suallar

ListView köhnəlmişdir, ya yox?

ListView Android SDK API 35-də @Deprecated kimi qeyd olunmayıb, lakin Google yeni layihələrdə ondan istifadəni tövsiyə etmir (soft-deprecated). Komponent Android-in bütün versiyalarında işlək qalır. RecyclerView 2014-cü ildən rəsmi əvəzedicidir. Yeni layihəyə başlayırsınızsa — RecyclerView seçin. Mövcud layihəni dəstəkləyirsinizsə — ListView dəyişiklik olmadan işləməyə davam edəcək.

ListView-ə header/footer necə əlavə etməli?

ListView addHeaderView(View, Object, boolean)addFooterView(View, Object, boolean) metodlarını dəstəkləyir. Header və footer elementlərin ümumi siyahısına əlavə edilir, lakin adapterdə iştirak etmir — onlar həmişə siyahının əvvəlində və sonunda göstərilir. Vacibdir: header/footer-i adapteri təyin etməzdən əvvəl əlavə edin (setAdapter()), əks halda nəzərə alınmayacaq. Header əlavə edildikdən sonra element mövqelərinin ID-ləri headerlərin sayı qədər dəyişir.

Nə üçün ListView ScrollView içərisində sürüşmür?

ListViewScrollView hər ikisi şaquli jestləri idarə edir, bu da konflikt yaradır: xarici ScrollView sürüşdürməni ələ keçirir və ListView sürüşmür. Həll yolları: (1) ListView-i ScrollView-ə yerləşdirməyin — NestedScrollingChild ilə RecyclerView istifadə edin, (2) ScrollView-i NestedScrollView (API 21+) ilə əvəz edin, (3) ScrollView içərisində sabit hündürlüklü (android:layout_height="...dp") ListView istifadə edin, lakin bu adaptivliyi pozacaq.

ListView-i necə təmizləmək və məlumatları yeniləmək olar?

ListView-də məlumatların təmizlənməsi adapter növündən asılıdır. ArrayAdapter üçün: adapter.clear()adapter.addAll(newList) ardınca adapter.notifyDataSetChanged(). Fərdi adapter üçün: məlumat siyahısını yeniləyin və notifyDataSetChanged() çağırın. Diqqət: listView.invalidateViews() yalnız View-i yenidən çəkir, lakin məlumatları yeniləmir. Həmişə məlumatları birbaşa deyil, adapter vasitəsilə dəyişin.

ListView elementinin hündürlüyünü necə dəyişməli?

ListView elementinin hündürlüyü item-maketində təyin edilir. Maket layout_height="wrap_content" istifadə edirsə, hündürlük məzmununa uyğunlaşır. Bütün elementlər üçün sabit hündürlük üçün getView()-də LayoutParams təyin edən fərdi adapter istifadə edin: view.layoutParams.height = resources.getDimensionPixelSize(R.dimen.itemHeight). Müxtəlif hündürlüklər üçün müxtəlif görünüş tipləri ilə RecyclerView istifadə edin.

Yekun

  • ListView — API 1-dən etibarən şaquli siyahılar üçün əsas Android SDK komponenti.
  • ArrayAdapter — sətir siyahısı üçün ən sadə adapter; fərdi maketlər üçün yenidən təyin edilmiş getView() lazımdır.
  • ViewHolder ListView-də əl ilə convertView və view.tag vasitəsilə tətbiq edilir — performans üçün məcburi şərt.
  • ListView choiceMode (single/multiple), header/footer, fastScroll və adaptersiz android:entries dəstəkləyir.
  • ListView-in məhdudiyyətləri: yalnız şaquli oriyentasiya, animasiyanın olmaması, hər dəyişiklikdə tam yenidən çəkmə.
  • ListView köhnəlmiş kimi qeyd olunmayıb, lakin Google bütün yeni layihələr üçün RecyclerView tövsiyə edir.
  • 50 elementə qədər siyahılar üçün ListView kifayətdir; daha mürəkkəb hər şey üçün — RecyclerView istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun