{"id":34892,"date":"2025-11-23T09:40:55","date_gmt":"2025-11-23T06:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34892"},"modified":"2025-11-23T09:40:55","modified_gmt":"2025-11-23T06:40:55","slug":"android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/","title":{"rendered":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Android uygulama geli\u015ftirmede, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (UI) en \u00f6nemli bile\u015fenlerinden biri, b\u00fcy\u00fck veri setlerini verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fclememizi sa\u011flayan listelerdir. Geleneksel ListView ve GridView bile\u015fenlerinin yerini alan RecyclerView, modern Android uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. RecyclerView&#8217;\u0131n g\u00fcc\u00fc, verilerin ekranda nas\u0131l konumland\u0131r\u0131laca\u011f\u0131n\u0131 belirleyen LayoutManager bile\u015feninin esnekli\u011finden gelir. Bu makalede, RecyclerView&#8217;\u0131n pop\u00fcler LayoutManager t\u00fcrlerinden biri olan GridLayoutManager&#8217;\u0131 derinlemesine inceleyecek, nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m g\u00f6sterecek ve ileri seviye \u00f6zelle\u015ftirme se\u00e7eneklerini ele alaca\u011f\u0131z.<\/p>\n<h3>RecyclerView ve LayoutManager Kavramlar\u0131<\/h3>\n<p>Android uygulamalar\u0131nda verimli listeleme, performans ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. RecyclerView, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc bir bile\u015fendir.<\/p>\n<h4>RecyclerView Nedir?<\/h4>\n<p>RecyclerView, b\u00fcy\u00fck veri setlerini kayd\u0131r\u0131labilir bir listede veya \u0131zgarada g\u00f6r\u00fcnt\u00fclemek i\u00e7in kullan\u0131lan geli\u015fmi\u015f bir widget&#8217;t\u0131r. Geleneksel ListView ve GridView&#8217;a g\u00f6re bir\u00e7ok avantaj sunar:<\/p>\n<p>*   <strong>Performans:<\/strong> \u00d6\u011felerin yeniden kullan\u0131m\u0131 (view recycling) sayesinde bellek ve i\u015flemci kullan\u0131m\u0131n\u0131 optimize eder. Sadece ekranda g\u00f6r\u00fcnen \u00f6\u011feler olu\u015fturulur ve kayd\u0131rma s\u0131ras\u0131nda g\u00f6r\u00fcnmez hale gelen \u00f6\u011feler yeniden kullan\u0131l\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> \u00d6\u011felerin nas\u0131l d\u00fczenlenece\u011fi (LayoutManager), \u00f6\u011feler aras\u0131ndaki bo\u015fluklar (ItemDecoration), \u00f6\u011felerin eklenmesi\/\u00e7\u0131kar\u0131lmas\u0131 animasyonlar\u0131 (ItemAnimator) gibi bir\u00e7ok \u00f6zelli\u011fi kolayca \u00f6zelle\u015ftirmeye olanak tan\u0131r.<br \/>\n*   <strong>ViewHolder Deseni:<\/strong> ViewHolder deseni varsay\u0131lan olarak zorunlu k\u0131larak geli\u015ftiricileri daha performansl\u0131 kod yazmaya te\u015fvik eder. Bu, her \u00f6\u011fe i\u00e7in findViewById \u00e7a\u011fr\u0131lar\u0131n\u0131n tekrar tekrar yap\u0131lmas\u0131n\u0131 engeller.<\/p>\n<p>Bir RecyclerView&#8217;\u0131n temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Adapter:<\/strong> Veri setini al\u0131r ve her bir \u00f6\u011fenin nas\u0131l g\u00f6r\u00fcnt\u00fclenece\u011fini belirler. Veri ile UI \u00f6\u011feleri aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<br \/>\n*   <strong>ViewHolder:<\/strong> Her bir liste \u00f6\u011fesinin g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc (layout) ve bu g\u00f6r\u00fcn\u00fcmdeki alt \u00f6\u011felere referanslar\u0131 tutan bir s\u0131n\u0131ft\u0131r. findViewById \u00e7a\u011fr\u0131lar\u0131n\u0131 optimize eder.<br \/>\n*   <strong>LayoutManager:<\/strong> \u00d6\u011felerin ekranda nas\u0131l konumland\u0131r\u0131laca\u011f\u0131n\u0131, d\u00fczenlenece\u011fini ve kayd\u0131rma davran\u0131\u015f\u0131n\u0131 y\u00f6netir. RecyclerView&#8217;\u0131n en esnek k\u0131s\u0131mlar\u0131ndan biridir.<br \/>\n*   <strong>ItemDecoration:<\/strong> \u00d6\u011feler aras\u0131na ay\u0131r\u0131c\u0131lar, bo\u015fluklar veya \u00f6zel \u00e7izimler eklemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>ItemAnimator:<\/strong> \u00d6\u011felerin eklenmesi, \u00e7\u0131kar\u0131lmas\u0131 veya ta\u015f\u0131nmas\u0131 s\u0131ras\u0131ndaki animasyonlar\u0131 y\u00f6netir.<\/p>\n<h4>LayoutManager Nedir ve Neden \u00d6nemlidir?<\/h4>\n<p>LayoutManager, RecyclerView&#8217;\u0131n kalbidir diyebiliriz. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, &#8220;d\u00fczen y\u00f6neticisi&#8221; olarak g\u00f6rev yapar. \u00d6\u011felerin ekranda hangi d\u00fczende (s\u0131ral\u0131 liste, \u0131zgara, kademeli \u0131zgara vb.) ve nas\u0131l konumland\u0131r\u0131laca\u011f\u0131n\u0131 belirler. Ayr\u0131ca, kayd\u0131rma davran\u0131\u015f\u0131n\u0131 da y\u00f6neten ana bile\u015fendir. LayoutManager olmadan RecyclerView \u00e7al\u0131\u015fmaz.<\/p>\n<p>Android SDK&#8217;s\u0131 \u00fc\u00e7 temel LayoutManager sa\u011flar:<\/p>\n<p>1.  <strong>LinearLayoutManager:<\/strong> \u00d6\u011feleri tek bir y\u00f6nde (dikey veya yatay) do\u011frusal bir liste olarak d\u00fczenler. Klasik ListView davran\u0131\u015f\u0131n\u0131 sa\u011flar.<br \/>\n2.  <strong>GridLayoutManager:<\/strong> \u00d6\u011feleri iki boyutlu bir \u0131zgara i\u00e7inde d\u00fczenler. Bu makalenin ana konusudur.<br \/>\n3.  <strong>StaggeredGridLayoutManager:<\/strong> \u00d6\u011feleri kademeli (staggered) bir \u0131zgara i\u00e7inde d\u00fczenler. Her \u00f6\u011fenin farkl\u0131 boyutlarda olabilece\u011fi ve bo\u015fluklar\u0131 doldurmak i\u00e7in optimize edildi\u011fi durumlarda kullan\u0131\u015fl\u0131d\u0131r (\u00f6rne\u011fin Pinterest tarz\u0131 galeriler).<\/p>\n<p>LayoutManager&#8217;\u0131n \u00f6nemi, uygulaman\u0131z\u0131n g\u00f6rsel sunumunu ve kullan\u0131c\u0131 etkile\u015fimini do\u011frudan etkilemesinden kaynaklan\u0131r. Do\u011fru LayoutManager se\u00e7imi, veri setinizin do\u011fas\u0131na ve uygulaman\u0131z\u0131n tasar\u0131m hedeflerine uygun, performansl\u0131 ve kullan\u0131c\u0131 dostu bir aray\u00fcz olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>GridLayoutManager&#8217;a Derinlemesine Bak\u0131\u015f<\/h3>\n<p>GridLayoutManager, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, \u00f6\u011feleri bir \u0131zgara (grid) d\u00fczeninde g\u00f6stermek i\u00e7in tasarlanm\u0131\u015ft\u0131r. G\u00f6rsel olarak \u00e7ekici ve d\u00fczenli bir sunum gerekti\u011finde tercih edilen bir LayoutManager&#8217;d\u0131r.<\/p>\n<h4>GridLayoutManager Nedir?<\/h4>\n<p>GridLayoutManager, RecyclerView \u00f6\u011felerini sabit say\u0131da s\u00fctun (dikey kayd\u0131rma i\u00e7in) veya sat\u0131r (yatay kayd\u0131rma i\u00e7in) i\u00e7eren bir \u0131zgarada d\u00fczenler. Her \u00f6\u011fe, \u0131zgaran\u0131n bir &#8220;h\u00fccresini&#8221; kaplar. Bu, foto\u011fraf galerileri, \u00fcr\u00fcn kataloglar\u0131 veya men\u00fc ekranlar\u0131 gibi g\u00f6rsel a\u011f\u0131rl\u0131kl\u0131 uygulamalar i\u00e7in idealdir.<\/p>\n<p>GridLayoutManager&#8217;\u0131n kurucusunda (constructor) genellikle iki ana parametre bulunur:<\/p>\n<p>*   <strong><code>spanCount<\/code>:<\/strong> Izgaradaki s\u00fctun say\u0131s\u0131n\u0131 (e\u011fer kayd\u0131rma y\u00f6n\u00fc dikey ise) veya sat\u0131r say\u0131s\u0131n\u0131 (e\u011fer kayd\u0131rma y\u00f6n\u00fc yatay ise) belirler. Bu parametre, \u0131zgaran\u0131n temel yap\u0131s\u0131n\u0131 olu\u015fturur.<br \/>\n*   <strong><code>orientation<\/code>:<\/strong> Kayd\u0131rma y\u00f6n\u00fcn\u00fc belirler. <code>LinearLayoutManager.VERTICAL<\/code> (varsay\u0131lan) veya <code>LinearLayoutManager.HORIZONTAL<\/code> olabilir.<br \/>\n*   <strong><code>reverseLayout<\/code>:<\/strong> \u00d6\u011felerin d\u00fczenlenme s\u0131ras\u0131n\u0131 tersine \u00e7evirip \u00e7evirmeyece\u011fini belirler. <code>true<\/code> ise son eklenen \u00f6\u011fe en ba\u015fta g\u00f6r\u00fcn\u00fcr.<\/p>\n<p>\u00d6rne\u011fin, <code>new GridLayoutManager(context, 2)<\/code> kodu, dikey kayd\u0131rmal\u0131 ve her sat\u0131rda 2 s\u00fctun bulunan bir \u0131zgara olu\u015fturur.<\/p>\n<h4>Temel \u00d6zellikleri ve Avantajlar\u0131<\/h4>\n<p>GridLayoutManager&#8217;\u0131n sundu\u011fu temel \u00f6zellikler ve avantajlar \u015funlard\u0131r:<\/p>\n<p>*   <strong>Izgara Tabanl\u0131 D\u00fczen:<\/strong> \u00d6\u011feleri d\u00fczenli ve estetik bir \u0131zgara yap\u0131s\u0131nda sunar. G\u00f6rsel olarak benzer \u00f6\u011felerin yan yana gelmesi, kullan\u0131c\u0131lar\u0131n bilgiyi daha h\u0131zl\u0131 i\u015flemesine yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Esneklik:<\/strong> <code>spanCount<\/code> parametresi sayesinde, farkl\u0131 ekran boyutlar\u0131na veya oryantasyonlara g\u00f6re kolayca ayarlanabilir s\u00fctun\/sat\u0131r say\u0131lar\u0131 ile dinamik layout&#8217;lar olu\u015fturulabilir.<br \/>\n*   <strong>Performans:<\/strong> RecyclerView&#8217;\u0131n temel yap\u0131s\u0131 sayesinde, GridLayoutManager da \u00f6\u011fe yeniden kullan\u0131m\u0131 ve optimize edilmi\u015f \u00e7izim s\u00fcre\u00e7leri ile y\u00fcksek performans sunar. \u00d6zellikle b\u00fcy\u00fck veri setleri ile \u00e7al\u0131\u015f\u0131rken bu performans kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Izgara d\u00fczenleri, g\u00f6rsellerin \u00f6n planda oldu\u011fu uygulamalarda kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. Kullan\u0131c\u0131lar, bir\u00e7ok \u00f6\u011feyi ayn\u0131 anda g\u00f6rebilir ve h\u0131zl\u0131ca g\u00f6z atabilir.<br \/>\n*   <strong><code>SpanSizeLookup<\/code> Deste\u011fi:<\/strong> \u00d6\u011felerin farkl\u0131 geni\u015fliklerde olabilmesine olanak tan\u0131yan <code>SpanSizeLookup<\/code> \u00f6zelli\u011fi ile daha karma\u015f\u0131k \u0131zgara tasar\u0131mlar\u0131 m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h4>Kullan\u0131m Senaryolar\u0131<\/h4>\n<p>GridLayoutManager, bir\u00e7ok farkl\u0131 uygulama t\u00fcr\u00fcnde ve senaryoda ba\u015far\u0131yla kullan\u0131labilir:<\/p>\n<p>*   <strong>Galeri Uygulamalar\u0131:<\/strong> Foto\u011fraflar\u0131n veya videolar\u0131n k\u00fc\u00e7\u00fck \u00f6nizlemelerini \u0131zgara \u015feklinde g\u00f6r\u00fcnt\u00fclemek i\u00e7in en yayg\u0131n kullan\u0131m alan\u0131d\u0131r.<br \/>\n*   <strong>\u00dcr\u00fcn Kataloglar\u0131\/E-ticaret Uygulamalar\u0131:<\/strong> \u00dcr\u00fcn resimlerini ve k\u0131sa a\u00e7\u0131klamalar\u0131n\u0131 i\u00e7eren kartlar\u0131 d\u00fczenli bir \u0131zgarada sunarak kullan\u0131c\u0131n\u0131n \u00fcr\u00fcnlere g\u00f6z atmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Men\u00fc ve Kategori Ekranlar\u0131:<\/strong> Uygulama i\u00e7indeki farkl\u0131 b\u00f6l\u00fcmleri veya kategorileri temsil eden simgeleri ve metinleri \u0131zgara \u015feklinde d\u00fczenlemek i\u00e7in idealdir.<br \/>\n*   <strong>Ayarlar Listeleri:<\/strong> Baz\u0131 ayarlar\u0131n (\u00f6rne\u011fin tema se\u00e7imi, dil se\u00e7imi) g\u00f6rsel olarak daha zengin se\u00e7enekler sunmas\u0131 gerekti\u011finde \u00e7ok s\u00fctunlu bir \u0131zgara kullan\u0131labilir.<br \/>\n*   <strong>Oyunlar:<\/strong> Oyun i\u00e7i \u00f6\u011felerin, karakterlerin veya ba\u015far\u0131mlar\u0131n g\u00f6rsel listelerini sunmak i\u00e7in kullan\u0131labilir.<\/p>\n<h3>GridLayoutManager Kullan\u0131m\u0131: Ad\u0131m Ad\u0131m Rehber<\/h3>\n<p>\u015eimdi, bir Android projesinde GridLayoutManager&#8217;\u0131 ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 g\u00f6relim. Basit bir resim galerisi \u00f6rne\u011fi \u00fczerinden ilerleyece\u011fiz.<\/p>\n<h4>Proje Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>\u00d6ncelikle, <code>app\/build.gradle<\/code> dosyan\u0131za RecyclerView ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 eklemeniz gerekir:<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    \/\/ Di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\n    implementation 'androidx.recyclerview:recyclerview:1.3.2' \/\/ En son s\u00fcr\u00fcm\u00fc kontrol edin\n    implementation 'com.github.bumptech.glide:glide:4.16.0' \/\/ Resim y\u00fcklemek i\u00e7in (iste\u011fe ba\u011fl\u0131)\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'\n}<\/code><\/pre>\n<p>Ard\u0131ndan, <code>AndroidManifest.xml<\/code> dosyan\u0131za internet izni eklemeniz gerekebilir, e\u011fer resimleri internetten y\u00fckl\u00fcyorsan\u0131z:<\/p>\n<pre><code class=\"language-xml\"><uses-permission android:name=\"android.permission.INTERNET\" \/><\/code><\/pre>\n<h4>Layout Dosyas\u0131 (<code>activity_main.xml<\/code>)<\/h4>\n<p>Ana aktivite layout dosyan\u0131zda bir RecyclerView tan\u0131mlay\u0131n:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id\/recyclerView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        android:padding=\"4dp\"\n        android:clipToPadding=\"false\" \/> <!-- Kenar bo\u015fluklar\u0131n\u0131n k\u0131rp\u0131lmas\u0131n\u0131 engeller -->\n\n<\/androidx.constraintlayout.widget.ConstraintLayout><\/code><\/pre>\n<h4>Veri Modeli (<code>ImageItem.java<\/code>)<\/h4>\n<p>G\u00f6r\u00fcnt\u00fcleyece\u011fimiz her \u00f6\u011fe i\u00e7in basit bir veri modeli olu\u015ftural\u0131m. Bu \u00f6rnekte bir resim URL&#8217;si ve bir ba\u015fl\u0131k i\u00e7erecek.<\/p>\n<pre><code class=\"language-java\">package com.example.gridlayoutmanager_example; \/\/ Paket ad\u0131n\u0131z\u0131 g\u00fcncelleyin\n\npublic class ImageItem {\n    private String imageUrl;\n    private String title;\n\n    public ImageItem(String imageUrl, String title) {\n        this.imageUrl = imageUrl;\n        this.title = title;\n    }\n\n    public String getImageUrl() {\n        return imageUrl;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n}<\/code><\/pre>\n<h4>\u00d6\u011fe Layout Dosyas\u0131 (<code>item_grid.xml<\/code>)<\/h4>\n<p>Her bir \u0131zgara \u00f6\u011fesinin nas\u0131l g\u00f6r\u00fcnece\u011fini tan\u0131mlayan bir layout dosyas\u0131 olu\u015fturun. Bu, bir ImageView ve bir TextView i\u00e7erecek.<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"4dp\"\n    app:cardCornerRadius=\"8dp\"\n    app:cardElevation=\"4dp\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:padding=\"8dp\">\n\n        <ImageView\n            android:id=\"@+id\/imageView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"120dp\"\n            android:scaleType=\"centerCrop\"\n            android:contentDescription=\"@string\/image_description\" \/>\n\n        <TextView\n            android:id=\"@+id\/textViewTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:textStyle=\"bold\"\n            android:textSize=\"14sp\"\n            android:gravity=\"center\"\n            android:maxLines=\"1\"\n            android:ellipsize=\"end\"\n            android:text=\"Resim Ba\u015fl\u0131\u011f\u0131\" \/>\n\n    <\/LinearLayout>\n\n<\/androidx.cardview.widget.CardView><\/code><\/pre>\n<p><code>strings.xml<\/code> dosyan\u0131za ekleyin:<\/p>\n<pre><code class=\"language-xml\"><string name=\"image_description\">Grid \u00f6\u011fesi resmi<\/string><\/code><\/pre>\n<h4>Adapter (<code>MyGridAdapter.java<\/code>)<\/h4>\n<p>Veri modelini <code>item_grid.xml<\/code> layout&#8217;una ba\u011flayacak olan adapt\u00f6r\u00fc olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">package com.example.gridlayoutmanager_example; \/\/ Paket ad\u0131n\u0131z\u0131 g\u00fcncelleyin\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.bumptech.glide.Glide; \/\/ Glide k\u00fct\u00fcphanesi\n\nimport java.util.List;\n\npublic class MyGridAdapter extends RecyclerView.Adapter<MyGridAdapter.MyViewHolder> {\n\n    private List<ImageItem> imageList;\n    private Context context;\n\n    public MyGridAdapter(Context context, List<ImageItem> imageList) {\n        this.context = context;\n        this.imageList = imageList;\n    }\n\n    @NonNull\n    @Override\n    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid, parent, false);\n        return new MyViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {\n        ImageItem currentItem = imageList.get(position);\n\n        \/\/ Glide ile resmi y\u00fckle\n        Glide.with(context)\n                .load(currentItem.getImageUrl())\n                .placeholder(R.drawable.placeholder_image) \/\/ Yer tutucu resim\n                .error(R.drawable.error_image) \/\/ Hata durumunda g\u00f6sterilecek resim\n                .into(holder.imageView);\n\n        holder.textViewTitle.setText(currentItem.getTitle());\n    }\n\n    @Override\n    public int getItemCount() {\n        return imageList.size();\n    }\n\n    public static class MyViewHolder extends RecyclerView.ViewHolder {\n        ImageView imageView;\n        TextView textViewTitle;\n\n        public MyViewHolder(@NonNull View itemView) {\n            super(itemView);\n            imageView = itemView.findViewById(R.id.imageView);\n            textViewTitle = itemView.findViewById(R.id.textViewTitle);\n        }\n    }\n}<\/code><\/pre>\n<p><code>placeholder_image.xml<\/code> ve <code>error_image.xml<\/code> dosyalar\u0131n\u0131 <code>drawable<\/code> klas\u00f6r\u00fcn\u00fcze eklemeyi unutmay\u0131n. Basit birer renk veya bir ikon olabilirler.<\/p>\n<h4>Ana Aktivite (<code>MainActivity.java<\/code>)<\/h4>\n<p>\u015eimdi t\u00fcm bile\u015fenleri bir araya getirelim ve GridLayoutManager&#8217;\u0131 uygulayal\u0131m.<\/p>\n<pre><code class=\"language-java\">package com.example.gridlayoutmanager_example; \/\/ Paket ad\u0131n\u0131z\u0131 g\u00fcncelleyin\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport android.os.Bundle;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private RecyclerView recyclerView;\n    private MyGridAdapter adapter;\n    private List<ImageItem> imageList;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        recyclerView = findViewById(R.id.recyclerView);\n\n        \/\/ Veri listesini haz\u0131rla\n        imageList = new ArrayList<>();\n        populateImageList(); \/\/ Resim verilerini dolduran metot\n\n        \/\/ Adapter'\u0131 olu\u015ftur\n        adapter = new MyGridAdapter(this, imageList);\n\n        \/\/ GridLayoutManager'\u0131 olu\u015ftur ve RecyclerView'a ata\n        \/\/ 2 s\u00fctunlu bir \u0131zgara olu\u015fturuyoruz\n        int spanCount = 2; \/\/ S\u00fctun say\u0131s\u0131\n        GridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);\n        recyclerView.setLayoutManager(layoutManager);\n\n        \/\/ Adapter'\u0131 RecyclerView'a ata\n        recyclerView.setAdapter(adapter);\n    }\n\n    private void populateImageList() {\n        \/\/ \u00d6rnek resim URL'leri ve ba\u015fl\u0131klar\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/10\/300\/300\", \"Do\u011fa Manzaras\u0131 1\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/20\/300\/300\", \"\u015eehir G\u00f6r\u00fcn\u00fcm\u00fc 1\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/30\/300\/300\", \"Hayvanlar Alemi 1\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/40\/300\/300\", \"Soyut Sanat 1\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/50\/300\/300\", \"Yemek Foto\u011fraf\u0131 1\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/60\/300\/300\", \"Do\u011fa Manzaras\u0131 2\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/70\/300\/300\", \"\u015eehir G\u00f6r\u00fcn\u00fcm\u00fc 2\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/80\/300\/300\", \"Hayvanlar Alemi 2\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/90\/300\/300\", \"Soyut Sanat 2\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/100\/300\/300\", \"Yemek Foto\u011fraf\u0131 2\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/110\/300\/300\", \"Do\u011fa Manzaras\u0131 3\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/120\/300\/300\", \"\u015eehir G\u00f6r\u00fcn\u00fcm\u00fc 3\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/130\/300\/300\", \"Hayvanlar Alemi 3\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/140\/300\/300\", \"Soyut Sanat 3\"));\n        imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/150\/300\/300\", \"Yemek Foto\u011fraf\u0131 3\"));\n        \/\/ Daha fazla \u00f6\u011fe ekleyebilirsiniz\n    }\n}<\/code><\/pre>\n<p>Bu ad\u0131mlar\u0131 takip ederek, Android uygulaman\u0131zda 2 s\u00fctunlu basit bir \u0131zgara listesi olu\u015fturmu\u015f olursunuz.<\/p>\n<h3>GridLayoutManager&#8217;\u0131 \u00d6zelle\u015ftirme ve \u0130leri Seviye Kullan\u0131m<\/h3>\n<p>GridLayoutManager, temel kullan\u0131m\u0131n\u0131n \u00f6tesinde, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re daha karma\u015f\u0131k ve dinamik d\u00fczenler olu\u015fturman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc \u00f6zelle\u015ftirme se\u00e7enekleri sunar.<\/p>\n<h4><code>spanCount<\/code> Y\u00f6netimi<\/h4>\n<p><code>spanCount<\/code> parametresi, \u0131zgaran\u0131n s\u00fctun (dikey kayd\u0131rma) veya sat\u0131r (yatay kayd\u0131rma) say\u0131s\u0131n\u0131 belirler. Bu de\u011feri, cihaz\u0131n ekran boyutuna veya oryantasyonuna g\u00f6re dinamik olarak de\u011fi\u015ftirmek, daha uyarlanabilir (responsive) bir kullan\u0131c\u0131 aray\u00fcz\u00fc sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<p>*   <strong>Cihaz Oryantasyonuna G\u00f6re <code>spanCount<\/code> De\u011fi\u015ftirme:<\/strong><br \/>\n    Uygulama dikey modda (portrait) farkl\u0131 say\u0131da s\u00fctun, yatay modda (landscape) farkl\u0131 say\u0131da s\u00fctun g\u00f6sterebilir. Bunu <code>Configuration<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak belirleyebilirsiniz:<\/p>\n<pre><code class=\"language-java\">import android.content.res.Configuration;\n    \/\/ ...\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        \/\/ ...\n        int spanCount;\n        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {\n            spanCount = 4; \/\/ Yatay modda 4 s\u00fctun\n        } else {\n            spanCount = 2; \/\/ Dikey modda 2 s\u00fctun\n        }\n        GridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);\n        recyclerView.setLayoutManager(layoutManager);\n        \/\/ ...\n    }<\/code><\/pre>\n<p>*   <strong>Ekran Geni\u015fli\u011fine G\u00f6re Dinamik <code>spanCount<\/code> Hesaplama:<\/strong><br \/>\n    Daha geli\u015fmi\u015f bir yakla\u015f\u0131m, \u00f6\u011fe geni\u015fli\u011fine ve ekran geni\u015fli\u011fine g\u00f6re dinamik olarak s\u00fctun say\u0131s\u0131n\u0131 hesaplamakt\u0131r. Bu, farkl\u0131 boyutlardaki cihazlarda \u00f6\u011felerin her zaman optimum say\u0131da s\u00fctunda g\u00f6r\u00fcnmesini sa\u011flar.<\/p>\n<pre><code class=\"language-java\">private int calculateSpanCount() {\n        \/\/ Her bir \u00f6\u011fenin minimum geni\u015fli\u011fini (dp cinsinden) belirleyin\n        int minItemWidthDp = 150; \/\/ \u00d6rne\u011fin, her \u00f6\u011fenin en az 150dp geni\u015fli\u011finde olmas\u0131n\u0131 istiyoruz\n\n        \/\/ Ekran geni\u015fli\u011fini piksel cinsinden al\u0131n\n        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();\n        float dpWidth = displayMetrics.widthPixels \/ displayMetrics.density;\n\n        \/\/ Ka\u00e7 tane \u00f6\u011fenin s\u0131\u011fabilece\u011fini hesaplay\u0131n\n        int spanCount = (int) (dpWidth \/ minItemWidthDp);\n\n        \/\/ Minimum 1 s\u00fctun olmal\u0131\n        return Math.max(1, spanCount);\n    }\n\n    \/\/ onCreate metodunda:\n    \/\/ int spanCount = calculateSpanCount();\n    \/\/ GridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);<\/code><\/pre>\n<h4><code>orientation<\/code> ve <code>reverseLayout<\/code><\/h4>\n<p>GridLayoutManager&#8217;\u0131n kurucusunda <code>spanCount<\/code>&#8216;\u0131n yan\u0131 s\u0131ra <code>orientation<\/code> ve <code>reverseLayout<\/code> parametreleri de bulunur.<\/p>\n<p>*   <strong><code>orientation<\/code>:<\/strong> \u00d6\u011felerin kayd\u0131rma y\u00f6n\u00fcn\u00fc ve \u0131zgaran\u0131n nas\u0131l d\u00fczenlenece\u011fini belirler.<br \/>\n    *   <code>GridLayoutManager.VERTICAL<\/code> (varsay\u0131lan): \u00d6\u011feler dikey olarak kayd\u0131r\u0131l\u0131r ve \u0131zgara s\u00fctunlara ayr\u0131l\u0131r. <code>spanCount<\/code> s\u00fctun say\u0131s\u0131n\u0131 temsil eder.<br \/>\n    *   <code>GridLayoutManager.HORIZONTAL<\/code>: \u00d6\u011feler yatay olarak kayd\u0131r\u0131l\u0131r ve \u0131zgara sat\u0131rlara ayr\u0131l\u0131r. <code>spanCount<\/code> sat\u0131r say\u0131s\u0131n\u0131 temsil eder.<\/p>\n<pre><code class=\"language-java\">\/\/ Yatay kayd\u0131rmal\u0131, 3 sat\u0131rl\u0131 bir \u0131zgara\n    GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.HORIZONTAL, false);<\/code><\/pre>\n<p>*   <strong><code>reverseLayout<\/code>:<\/strong> \u00d6\u011felerin d\u00fczenlenme s\u0131ras\u0131n\u0131 tersine \u00e7evirip \u00e7evirmeyece\u011fini belirler. <code>true<\/code> olarak ayarlan\u0131rsa, Adapter&#8217;daki ilk \u00f6\u011fe en sonda, son \u00f6\u011fe en ba\u015fta g\u00f6r\u00fcn\u00fcr. Sohbet uygulamalar\u0131nda veya kronolojik s\u0131ralaman\u0131n tersine \u00e7evrildi\u011fi durumlarda kullan\u0131\u015fl\u0131 olabilir.<\/p>\n<pre><code class=\"language-java\">\/\/ Dikey kayd\u0131rmal\u0131, 2 s\u00fctunlu, ters s\u0131ralamal\u0131 bir \u0131zgara\n    GridLayoutManager layoutManager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, true);<\/code><\/pre>\n<h4><code>SpanSizeLookup<\/code> ile Farkl\u0131 Boyutlardaki \u00d6\u011feler<\/h4>\n<p>GridLayoutManager&#8217;\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelle\u015ftirme \u00f6zelliklerinden biri <code>SpanSizeLookup<\/code>&#8216;tur. Varsay\u0131lan olarak, GridLayoutManager&#8217;daki her \u00f6\u011fe ayn\u0131 <code>spanCount<\/code> de\u011ferini (yani \u0131zgaradaki tek bir &#8220;span&#8221;\u0131) kaplar. Ancak bazen, bir ba\u015fl\u0131k, reklam banner&#8217;\u0131 veya \u00f6zel bir \u00f6\u011fe gibi baz\u0131 \u00f6\u011felerin t\u00fcm sat\u0131r\u0131 (veya birden fazla span&#8217;\u0131) kaplamas\u0131 gerekebilir. \u0130\u015fte bu noktada <code>SpanSizeLookup<\/code> devreye girer.<\/p>\n<p><code>SpanSizeLookup<\/code> soyut s\u0131n\u0131f\u0131n\u0131 geni\u015fleterek <code>getSpanSize(int position)<\/code> metodunu override etmeniz gerekir. Bu metot, belirli bir konumdaki \u00f6\u011fenin ka\u00e7 &#8220;span&#8221; kaplayaca\u011f\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>Neden ihtiya\u00e7 duyulur?<\/strong><br \/>\n*   <strong>Ba\u015fl\u0131klar:<\/strong> Bir kategori listesinde, kategori ba\u015fl\u0131klar\u0131 t\u00fcm sat\u0131r\u0131 kaplarken, alt\u0131ndaki \u00f6\u011feler \u0131zgara \u015feklinde d\u00fczenlenebilir.<br \/>\n*   <strong>Reklamlar:<\/strong> Bir reklam banner&#8217;\u0131, \u0131zgaradaki di\u011fer i\u00e7erik \u00f6\u011felerinden daha geni\u015f bir alana yay\u0131labilir.<br \/>\n*   <strong>Farkl\u0131 T\u00fcrde \u00d6\u011feler:<\/strong> Uygulaman\u0131zda birden fazla \u00f6\u011fe t\u00fcr\u00fc varsa ve bunlar\u0131n baz\u0131lar\u0131 \u0131zgaran\u0131n farkl\u0131 bir b\u00f6l\u00fcm\u00fcn\u00fc kaplamal\u0131ysa.<\/p>\n<p><strong>\u00d6rnek Senaryo ve Kod:<\/strong><br \/>\nDiyelim ki bir \u0131zgaram\u0131z var ve baz\u0131 \u00f6\u011feler normal \u0131zgara \u00f6\u011feleri (1 span), baz\u0131lar\u0131 ise ba\u015fl\u0131k (t\u00fcm sat\u0131r\u0131 kaplayan, yani <code>spanCount<\/code> kadar span) olsun.<\/p>\n<p>\u00d6nce <code>ImageItem<\/code> veri modelimizi geni\u015fletelim ve bir <code>type<\/code> alan\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-java\">public class ImageItem {\n    public static final int TYPE_NORMAL = 0;\n    public static final int TYPE_HEADER = 1;\n\n    private String imageUrl;\n    private String title;\n    private int type;\n\n    public ImageItem(String imageUrl, String title, int type) {\n        this.imageUrl = imageUrl;\n        this.title = title;\n        this.type = type;\n    }\n\n    \/\/ Getter metotlar\u0131\n    public String getImageUrl() { return imageUrl; }\n    public String getTitle() { return title; }\n    public int getType() { return type; }\n}<\/code><\/pre>\n<p>Ard\u0131ndan, <code>populateImageList()<\/code> metodunda baz\u0131 ba\u015fl\u0131k \u00f6\u011feleri ekleyelim:<\/p>\n<pre><code class=\"language-java\">private void populateImageList() {\n    imageList.add(new ImageItem(null, \"Kategoriler\", ImageItem.TYPE_HEADER)); \/\/ Ba\u015fl\u0131k\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/10\/300\/300\", \"Do\u011fa Manzaras\u0131 1\", ImageItem.TYPE_NORMAL));\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/20\/300\/300\", \"\u015eehir G\u00f6r\u00fcn\u00fcm\u00fc 1\", ImageItem.TYPE_NORMAL));\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/30\/300\/300\", \"Hayvanlar Alemi 1\", ImageItem.TYPE_NORMAL));\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/40\/300\/300\", \"Soyut Sanat 1\", ImageItem.TYPE_NORMAL));\n\n    imageList.add(new ImageItem(null, \"Pop\u00fcler \u0130\u00e7erikler\", ImageItem.TYPE_HEADER)); \/\/ Ba\u015fl\u0131k\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/50\/300\/300\", \"Yemek Foto\u011fraf\u0131 1\", ImageItem.TYPE_NORMAL));\n    imageList.add(new ImageItem(\"https:\/\/picsum.photos\/id\/60\/300\/300\", \"Do\u011fa Manzaras\u0131 2\", ImageItem.TYPE_NORMAL));\n    \/\/ ... di\u011fer \u00f6\u011feler\n}<\/code><\/pre>\n<p>Adapt\u00f6r\u00fcn\u00fczde <code>getItemViewType<\/code> metodunu override ederek farkl\u0131 t\u00fcrler i\u00e7in farkl\u0131 layout&#8217;lar kullanabilirsiniz. Bu \u00f6rnekte sadece <code>SpanSizeLookup<\/code>&#8216;a odaklanaca\u011f\u0131z, bu y\u00fczden ba\u015fl\u0131k \u00f6\u011feleri i\u00e7in resim alan\u0131 bo\u015f kalacakt\u0131r.<\/p>\n<p>Son olarak, <code>MainActivity<\/code>&#8216;de <code>GridLayoutManager<\/code>&#8216;a <code>SpanSizeLookup<\/code>&#8216;\u0131 atay\u0131n:<\/p>\n<pre><code class=\"language-java\">\/\/ MainActivity.java i\u00e7inde onCreate metodunda\n\/\/ ...\nint spanCount = 2;\nGridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);\n\nlayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {\n    @Override\n    public int getSpanSize(int position) {\n        \/\/ E\u011fer \u00f6\u011fe ba\u015fl\u0131k t\u00fcr\u00fcndeyse, t\u00fcm spanCount kadar yer kapla (t\u00fcm sat\u0131r)\n        \/\/ Aksi halde, normal bir \u00f6\u011fe gibi 1 span kapla\n        return imageList.get(position).getType() == ImageItem.TYPE_HEADER ? spanCount : 1;\n    }\n});\nrecyclerView.setLayoutManager(layoutManager);\n\/\/ ...<\/code><\/pre>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, ba\u015fl\u0131k \u00f6\u011felerinin \u0131zgarada tek ba\u015f\u0131na t\u00fcm geni\u015fli\u011fi kaplamas\u0131n\u0131, di\u011fer \u00f6\u011felerin ise normal \u0131zgara d\u00fczenine uymas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Item Dekorasyonlar\u0131 (<code>ItemDecoration<\/code>)<\/h4>\n<p>RecyclerView&#8217;daki \u00f6\u011feler aras\u0131na bo\u015fluklar, ay\u0131r\u0131c\u0131 \u00e7izgiler veya \u00f6zel \u00e7izimler eklemek i\u00e7in <code>ItemDecoration<\/code> kullan\u0131l\u0131r. GridLayoutManager ile \u00e7al\u0131\u015f\u0131rken, \u0131zgaradaki \u00f6\u011feler aras\u0131ndaki bo\u015fluklar\u0131 do\u011fru bir \u015fekilde y\u00f6netmek \u00f6nemlidir.<\/p>\n<p>Basit bir bo\u015fluk eklemek i\u00e7in \u00f6zel bir <code>ItemDecoration<\/code> olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-java\">package com.example.gridlayoutmanager_example;\n\nimport android.graphics.Rect;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {\n\n    private final int spacing;\n    private final int spanCount;\n    private final boolean includeEdge;\n\n    public GridSpaceItemDecoration(int spacing, int spanCount, boolean includeEdge) {\n        this.spacing = spacing;\n        this.spanCount = spanCount;\n        this.includeEdge = includeEdge;\n    }\n\n    @Override\n    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,\n                               @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {\n        int position = parent.getChildAdapterPosition(view); \/\/ item position\n        int column = position % spanCount; \/\/ item column\n\n        if (includeEdge) {\n            outRect.left = spacing - column <em> spacing \/ spanCount; \/\/ spacing - column <\/em> ((1f \/ spanCount) * spacing)\n            outRect.right = (column + 1) <em> spacing \/ spanCount; \/\/ (column + 1) <\/em> ((1f \/ spanCount) * spacing)\n\n            if (position < spanCount) { \/\/ top edge\n                outRect.top = spacing;\n            }\n            outRect.bottom = spacing; \/\/ item bottom\n        } else {\n            outRect.left = column <em> spacing \/ spanCount; \/\/ column <\/em> ((1f \/ spanCount) * spacing)\n            outRect.right = spacing - (column + 1) <em> spacing \/ spanCount; \/\/ spacing - (column + 1) <\/em> ((1f \/ spanCount) * spacing)\n            if (position >= spanCount) {\n                outRect.top = spacing; \/\/ item top\n            }\n        }\n    }\n}<\/code><\/pre>\n<p>Ve <code>MainActivity<\/code>&#8216;de bu dekorasyonu ekleyin:<\/p>\n<pre><code class=\"language-java\">\/\/ MainActivity.java i\u00e7inde onCreate metodunda\n\/\/ ...\nint spacingInPixels = getResources().getDimensionPixelSize(R.dimen.grid_spacing); \/\/ \u00d6rne\u011fin, 8dp\nrecyclerView.addItemDecoration(new GridSpaceItemDecoration(spacingInPixels, spanCount, true));\n\/\/ ...<\/code><\/pre>\n<p><code>dimens.xml<\/code> dosyan\u0131za ekleyin:<\/p>\n<pre><code class=\"language-xml\"><dimen name=\"grid_spacing\">8dp<\/dimen><\/code><\/pre>\n<p>Bu <code>ItemDecoration<\/code>, \u0131zgaradaki t\u00fcm \u00f6\u011feler aras\u0131nda e\u015fit bo\u015fluklar b\u0131rak\u0131r ve kenarlara da bo\u015fluk ekleyip eklemeyece\u011finizi kontrol etmenizi sa\u011flar.<\/p>\n<h4>Scroll Dinleyicileri (<code>OnScrollListener<\/code>)<\/h4>\n<p><code>RecyclerView.OnScrollListener<\/code> kullanarak kayd\u0131rma olaylar\u0131n\u0131 dinleyebilir ve \u00f6rne\u011fin sonsuz kayd\u0131rma (infinite scrolling) gibi \u00f6zellikler uygulayabilirsiniz. Bu, kullan\u0131c\u0131 listenin sonuna yakla\u015ft\u0131\u011f\u0131nda yeni veri y\u00fcklemek i\u00e7in yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ MainActivity.java i\u00e7inde onCreate metodunda\n\/\/ ...\nrecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n    @Override\n    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {\n        super.onScrolled(recyclerView, dx, dy);\n\n        GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();\n        if (layoutManager == null) return;\n\n        int visibleItemCount = layoutManager.getChildCount();\n        int totalItemCount = layoutManager.getItemCount();\n        int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();\n\n        \/\/ E\u011fer kayd\u0131rma a\u015fa\u011f\u0131 do\u011fruysa (dy > 0) ve son \u00f6\u011feye yakla\u015f\u0131yorsak\n        if (dy > 0 && (visibleItemCount + firstVisibleItemPosition) >= totalItemCount\n                && firstVisibleItemPosition >= 0) {\n            \/\/ Yeni veri y\u00fckleme i\u015flemini ba\u015flat\n            loadMoreData();\n        }\n    }\n});\n\/\/ ...\n\nprivate void loadMoreData() {\n    \/\/ Burada yeni verileri API'den veya ba\u015fka bir kaynaktan y\u00fckleme mant\u0131\u011f\u0131n\u0131 uygulay\u0131n\n    \/\/ \u00d6rne\u011fin:\n    \/\/ isDataLoading = true; \/\/ Veri y\u00fckleme durumunu takip etmek i\u00e7in\n    \/\/ showLoadingIndicator();\n    \/\/ ApiService.fetchMoreImages(currentPage, new Callback() { ... });\n    \/\/ Yeni veriler geldi\u011finde:\n    \/\/ int oldSize = imageList.size();\n    \/\/ imageList.addAll(newLoadedItems);\n    \/\/ adapter.notifyItemRangeInserted(oldSize, newLoadedItems.size());\n    \/\/ isDataLoading = false;\n    \/\/ hideLoadingIndicator();\n}<\/code><\/pre>\n<h3>Performans \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>RecyclerView ve GridLayoutManager ile \u00e7al\u0131\u015f\u0131rken uygulaman\u0131z\u0131n performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini art\u0131rmak i\u00e7in dikkat etmeniz gereken baz\u0131 \u00f6nemli noktalar vard\u0131r.<\/p>\n<h4>ViewHolder Kullan\u0131m\u0131<\/h4>\n<p>Her zaman <code>RecyclerView.ViewHolder<\/code> desenini kullan\u0131n. Bu, <code>findViewById()<\/code> \u00e7a\u011fr\u0131lar\u0131n\u0131n her \u00f6\u011fe i\u00e7in tekrar tekrar yap\u0131lmas\u0131n\u0131 engelleyerek performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Modern RecyclerView adapt\u00f6rlerinde bu zaten zorunludur.<\/p>\n<h4>Verimli <code>onBindViewHolder<\/code><\/h4>\n<p><code>onBindViewHolder<\/code> metodu, kayd\u0131rma s\u0131ras\u0131nda s\u0131k\u00e7a \u00e7a\u011fr\u0131l\u0131r. Bu metot i\u00e7inde a\u011f\u0131r veya zaman al\u0131c\u0131 i\u015flemlerden ka\u00e7\u0131n\u0131n. Sadece g\u00f6r\u00fcn\u00fcmdeki veriyi g\u00fcncellemeye odaklan\u0131n. A\u011f istekleri, disk i\u015flemleri veya karma\u015f\u0131k hesaplamalar bu metot d\u0131\u015f\u0131nda yap\u0131lmal\u0131d\u0131r.<\/p>\n<h4>Gereksiz Yeniden \u00c7izimleri Engelleme<\/h4>\n<p>Veri setinizde de\u011fi\u015fiklik oldu\u011funda, <code>adapter.notifyDataSetChanged()<\/code> yerine daha spesifik bildirim metotlar\u0131n\u0131 kullan\u0131n:<\/p>\n<p>*   <code>notifyItemChanged(position)<\/code>: Tek bir \u00f6\u011fe de\u011fi\u015fti\u011finde.<br \/>\n*   <code>notifyItemInserted(position)<\/code>: Tek bir \u00f6\u011fe eklendi\u011finde.<br \/>\n*   <code>notifyItemRemoved(position)<\/code>: Tek bir \u00f6\u011fe silindi\u011finde.<br \/>\n*   <code>notifyItemRangeChanged(positionStart, itemCount)<\/code>: Belirli bir aral\u0131ktaki \u00f6\u011feler de\u011fi\u015fti\u011finde.<br \/>\n*   <code>notifyItemRangeInserted(positionStart, itemCount)<\/code>: Belirli bir aral\u0131ktaki \u00f6\u011feler eklendi\u011finde.<br \/>\n*   <code>notifyItemRangeRemoved(positionStart, itemCount)<\/code>: Belirli bir aral\u0131ktaki \u00f6\u011feler silindi\u011finde.<\/p>\n<p>Bu metotlar, RecyclerView&#8217;\u0131n sadece etkilenen \u00f6\u011feleri g\u00fcncellemesini sa\u011flayarak gereksiz yeniden \u00e7izimleri ve performans kay\u0131plar\u0131n\u0131 \u00f6nler. DiffUtil s\u0131n\u0131f\u0131, iki liste aras\u0131ndaki farklar\u0131 otomatik olarak hesaplayarak bu bildirimleri daha verimli bir \u015fekilde yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Resim Y\u00fckleme K\u00fct\u00fcphaneleri<\/h4>\n<p>E\u011fer \u0131zgaran\u0131zda resimler g\u00f6r\u00fcnt\u00fcl\u00fcyorsan\u0131z, Glide, Picasso veya Coil gibi resim y\u00fckleme k\u00fct\u00fcphaneleri kullanmak zorunludur. Bu k\u00fct\u00fcphaneler:<\/p>\n<p>*   <strong>Asenkron Y\u00fckleme:<\/strong> Resimleri arka planda y\u00fckler, UI&#8217;\u0131n donmas\u0131n\u0131 engeller.<br \/>\n*   <strong>\u00d6nbellekleme:<\/strong> Y\u00fcklenen resimleri bellekte ve diskte \u00f6nbelle\u011fe alarak tekrar y\u00fcklemeleri h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong>K\u00fc\u00e7\u00fcltme ve D\u00f6n\u00fc\u015ft\u00fcrme:<\/strong> B\u00fcy\u00fck resimleri ImageView boyutuna g\u00f6re otomatik olarak k\u00fc\u00e7\u00fclt\u00fcr ve bellek kullan\u0131m\u0131n\u0131 optimize eder.<br \/>\n*   <strong>Placeholder\/Error Y\u00f6netimi:<\/strong> Resim y\u00fcklenirken veya hata olu\u015ftu\u011funda yer tutucu resimler g\u00f6stermenizi sa\u011flar.<\/p>\n<h4>\u00d6\u011felerin Hafif Tutulmas\u0131<\/h4>\n<p>Her bir \u0131zgara \u00f6\u011fesinin layout&#8217;unu olabildi\u011fince basit ve d\u00fcz tutmaya \u00e7al\u0131\u015f\u0131n. \u00c7ok fazla i\u00e7 i\u00e7e ge\u00e7mi\u015f layout (nested layouts) veya karma\u015f\u0131k view hiyerar\u015fileri, \u00e7izim performans\u0131n\u0131 olumsuz etkileyebilir. ConstraintLayout, karma\u015f\u0131k layout&#8217;lar\u0131 d\u00fcz bir hiyerar\u015fide olu\u015fturmak i\u00e7in iyi bir se\u00e7enektir.<\/p>\n<h3>Yayg\u0131n Hatalar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>GridLayoutManager ile \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri:<\/p>\n<h4><code>spanCount<\/code> Hatas\u0131<\/h4>\n<p>*   <strong>Sorun:<\/strong> <code>spanCount<\/code> de\u011ferinin negatif veya s\u0131f\u0131r olarak ayarlanmas\u0131, <code>IllegalArgumentException<\/code> hatas\u0131na yol a\u00e7ar.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>spanCount<\/code> her zaman 1 veya daha b\u00fcy\u00fck bir pozitif tam say\u0131 olmal\u0131d\u0131r.<\/p>\n<h4><code>IndexOutOfBoundsException<\/code><\/h4>\n<p>*   <strong>Sorun:<\/strong> Adapt\u00f6r\u00fcn <code>getItemCount()<\/code> metodu ile veri listesinin boyutu aras\u0131nda tutars\u0131zl\u0131k oldu\u011funda bu hata olu\u015fabilir. \u00d6rne\u011fin, <code>getItemCount()<\/code> yanl\u0131\u015f bir de\u011fer d\u00f6nd\u00fcr\u00fcyorsa veya <code>onBindViewHolder<\/code> i\u00e7inde ge\u00e7ersiz bir dizine eri\u015filmeye \u00e7al\u0131\u015f\u0131l\u0131yorsa.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>getItemCount()<\/code> metodunun her zaman g\u00fcncel veri listesinin boyutunu d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnden emin olun (<code>return dataList.size();<\/code>). Ayr\u0131ca, <code>onBindViewHolder<\/code> i\u00e7inde <code>position<\/code> de\u011ferinin <code>0<\/code> ile <code>getItemCount() - 1<\/code> aras\u0131nda oldu\u011fundan emin olun.<\/p>\n<h4>Bellek S\u0131z\u0131nt\u0131lar\u0131<\/h4>\n<p>*   <strong>Sorun:<\/strong> <code>ViewHolder<\/code> veya adapt\u00f6r i\u00e7inde aktivite <code>Context<\/code>&#8216;ine do\u011frudan referans tutulmas\u0131, aktivite yok edildi\u011finde (\u00f6rne\u011fin ekran d\u00f6nd\u00fcr\u00fcld\u00fc\u011f\u00fcnde) belle\u011fin serbest b\u0131rak\u0131lmamas\u0131na neden olabilir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Adapt\u00f6r veya <code>ViewHolder<\/code> i\u00e7inde <code>Context<\/code>&#8216;e ihtiya\u00e7 duyuldu\u011funda, <code>parent.getContext()<\/code> gibi bir metotla ge\u00e7ici olarak eri\u015fin veya <code>ApplicationContext<\/code> kullan\u0131n. Uzun \u00f6m\u00fcrl\u00fc referanslardan ka\u00e7\u0131n\u0131n. \u00d6zellikle <code>ViewHolder<\/code>&#8216;da <code>itemView.getContext()<\/code> genellikle yeterlidir.<\/p>\n<h4>UI Donmalar\u0131<\/h4>\n<p>*   <strong>Sorun:<\/strong> A\u011f istekleri, veritaban\u0131 i\u015flemleri, b\u00fcy\u00fck resimlerin i\u015flenmesi gibi uzun s\u00fcreli i\u015flemlerin ana i\u015f par\u00e7ac\u0131\u011f\u0131nda (UI thread) yap\u0131lmas\u0131, uygulaman\u0131n donmas\u0131na veya &#8220;Application Not Responding&#8221; (ANR) hatalar\u0131na yol a\u00e7ar.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> T\u00fcm a\u011f\u0131r i\u015flemleri arka plan i\u015f par\u00e7ac\u0131klar\u0131nda (background threads) ger\u00e7ekle\u015ftirin. Kotlin Coroutines, RxJava, AsyncTask (eski) veya Java&#8217;n\u0131n <code>Executor<\/code> servisleri gibi ara\u00e7lar\u0131 kullan\u0131n. \u0130\u015flem tamamland\u0131\u011f\u0131nda UI g\u00fcncellemelerini tekrar ana i\u015f par\u00e7ac\u0131\u011f\u0131na ta\u015f\u0131y\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Android GridLayoutManager, RecyclerView ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, uygulamalar\u0131n\u0131zda g\u00f6rsel olarak \u00e7ekici, d\u00fczenli ve performansl\u0131 \u0131zgara tabanl\u0131 listeler olu\u015fturman\u0131n anahtar\u0131d\u0131r. Foto\u011fraf galerilerinden \u00fcr\u00fcn kataloglar\u0131na, men\u00fc ekranlar\u0131ndan karma\u015f\u0131k veri g\u00f6rselle\u015ftirmelerine kadar geni\u015f bir kullan\u0131m yelpazesine sahiptir.<\/p>\n<p>Bu makalede, GridLayoutManager&#8217;\u0131n temel kavramlar\u0131ndan ba\u015flayarak ad\u0131m ad\u0131m nas\u0131l uygulanaca\u011f\u0131n\u0131, <code>spanCount<\/code>, <code>orientation<\/code>, <code>reverseLayout<\/code> gibi temel parametreleri nas\u0131l y\u00f6netece\u011finizi ve <code>SpanSizeLookup<\/code> ile farkl\u0131 boyutlardaki \u00f6\u011feleri nas\u0131l ele alaca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, <code>ItemDecoration<\/code> ile \u00f6\u011feler aras\u0131na bo\u015fluklar ekleme ve <code>OnScrollListener<\/code> ile sonsuz kayd\u0131rma gibi ileri seviye kullan\u0131m senaryolar\u0131na da de\u011findik. Performans ipu\u00e7lar\u0131 ve yayg\u0131n hatalar\u0131n \u00e7\u00f6z\u00fcmleri, geli\u015ftirme s\u00fcrecinizde kar\u015f\u0131la\u015fabilece\u011finiz zorluklar\u0131 a\u015fman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>GridLayoutManager&#8217;\u0131 do\u011fru bir \u015fekilde anlamak ve uygulamak, Android uygulaman\u0131z\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc zenginle\u015ftirecek ve kullan\u0131c\u0131lara daha iyi bir deneyim sunacakt\u0131r. Esnekli\u011fi, performans odakl\u0131 yap\u0131s\u0131 ve \u00f6zelle\u015ftirme yetenekleri sayesinde, modern Android geli\u015ftiricileri i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber\nAndroid uygulama geli\u015ftirmede, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34892","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber Android uygulama geli\u015ftirmede, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-23T06:40:55+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-23T06:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\"},\"wordCount\":2914,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\",\"name\":\"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-23T06:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber","og_description":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber Android uygulama geli\u015ftirmede, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (","og_url":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-23T06:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-23T06:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/"},"wordCount":2914,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/","name":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-23T06:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-gridlayoutmanager-ile-esnek-ve-duzenli-listeler-olusturma-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android GridLayoutManager ile Esnek ve D\u00fczenli Listeler Olu\u015fturma: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34892","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34892"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34892\/revisions"}],"predecessor-version":[{"id":34893,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34892\/revisions\/34893"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34892"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}