{"id":42345,"date":"2026-06-06T17:00:51","date_gmt":"2026-06-06T14:00:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=42345"},"modified":"2026-06-06T17:01:32","modified_gmt":"2026-06-06T14:01:32","slug":"android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/","title":{"rendered":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)"},"content":{"rendered":"<h2>Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)<\/h2>\n<p>Mobil uygulamalarda kullan\u0131c\u0131 deneyimi (UX), uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik bir fakt\u00f6rd\u00fcr. \u00d6zellikle b\u00fcy\u00fck veri k\u00fcmelerini listeleyen uygulamalarda, t\u00fcm veriyi ayn\u0131 anda y\u00fcklemek hem performans sorunlar\u0131na yol a\u00e7ar hem de kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) dondurabilir. Bu t\u00fcr senaryolarda &#8220;sonsuz kayd\u0131rma&#8221; veya &#8220;daha fazla y\u00fckleme (load more)&#8221; mekanizmas\u0131 devreye girer. Android ekosisteminde, bu i\u015flevselli\u011fi etkin bir \u015fekilde uygulamak i\u00e7in RecyclerView en g\u00fc\u00e7l\u00fc ara\u00e7lardan biridir. Bu makale, RecyclerView kullanarak sonsuz kayd\u0131rma ve daha fazla y\u00fckleme \u00f6zelliklerini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131, temel kavramlardan geli\u015fmi\u015f optimizasyonlara kadar detayl\u0131 bir \u015fekilde a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>Giri\u015f: Sonsuz Kayd\u0131rma Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Sonsuz kayd\u0131rma (infinite scrolling), kullan\u0131c\u0131 bir liste veya \u0131zgara g\u00f6r\u00fcn\u00fcm\u00fcnde a\u015fa\u011f\u0131 do\u011fru kayd\u0131rd\u0131\u011f\u0131nda, g\u00f6r\u00fcn\u00fcm\u00fcn sonuna yakla\u015ft\u0131\u011f\u0131nda otomatik olarak daha fazla i\u00e7eri\u011fin y\u00fcklenmesi prensibine dayan\u0131r. Bu, kullan\u0131c\u0131lar\u0131n kesintisiz bir deneyimle s\u00fcrekli yeni i\u00e7erik ke\u015ffetmelerini sa\u011flar. Facebook, Instagram, Twitter gibi pop\u00fcler sosyal medya uygulamalar\u0131 bu tekni\u011fi yayg\u0131n olarak kullan\u0131r.<\/p>\n<p>Bu yakla\u015f\u0131m\u0131n temel avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Geli\u015fmi\u015f Kullan\u0131c\u0131 Deneyimi:<\/strong> Kullan\u0131c\u0131lar\u0131n &#8220;Sonraki Sayfa&#8221; d\u00fc\u011fmesine t\u0131klamak yerine do\u011fal bir \u015fekilde kayd\u0131rmaya devam etmelerini sa\u011flar. Bu, ak\u0131c\u0131 ve kesintisiz bir etkile\u015fim sunar.<br \/>\n*   <strong>Performans Optimizasyonu:<\/strong> Uygulaman\u0131n ba\u015flang\u0131\u00e7ta yaln\u0131zca g\u00f6r\u00fcnen veya yak\u0131n zamanda g\u00f6r\u00fcnt\u00fclenecek veriyi y\u00fcklemesini sa\u011flar. Bu, uygulaman\u0131n daha h\u0131zl\u0131 ba\u015flamas\u0131na ve daha az bellek kullanmas\u0131na yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Sunucu Y\u00fck\u00fcn\u00fc Azaltma:<\/strong> Sunucu taraf\u0131nda da ayn\u0131 anda t\u00fcm veriyi g\u00f6ndermek yerine, sayfalama (pagination) yaparak daha k\u00fc\u00e7\u00fck veri par\u00e7ac\u0131klar\u0131 halinde g\u00f6nderim yap\u0131lmas\u0131n\u0131 te\u015fvik eder.<br \/>\n*   <strong>Artan Etkile\u015fim:<\/strong> Kullan\u0131c\u0131lar\u0131n i\u00e7erikle daha uzun s\u00fcre etkile\u015fimde kalmas\u0131na olanak tan\u0131r, \u00e7\u00fcnk\u00fc yeni i\u00e7erik s\u00fcrekli olarak sunulur.<\/p>\n<p>Ancak, sonsuz kayd\u0131rman\u0131n baz\u0131 dezavantajlar\u0131 da olabilir:<\/p>\n<p>*   <strong>Altbilgiye Ula\u015fmak Zorlu\u011fu:<\/strong> Sayfan\u0131n en alt\u0131na (footer) ula\u015fmak isteyen kullan\u0131c\u0131lar i\u00e7in zorluk yaratabilir, \u00e7\u00fcnk\u00fc yeni i\u00e7erik s\u00fcrekli y\u00fcklenir.<br \/>\n*   <strong>Konum Kayb\u0131:<\/strong> Kullan\u0131c\u0131lar bir i\u00e7eri\u011fe t\u0131klay\u0131p geri d\u00f6nd\u00fcklerinde, listedeki \u00f6nceki konumlar\u0131n\u0131 bulmakta zorlanabilirler.<br \/>\n*   <strong>Veri Y\u00fckleme Kontrol\u00fc:<\/strong> Kullan\u0131c\u0131n\u0131n ne zaman veri y\u00fcklemesinin durdurulaca\u011f\u0131na dair net bir g\u00f6sterge olmayabilir.<\/p>\n<p>Bu dezavantajlar\u0131 minimize etmek i\u00e7in, genellikle y\u00fckleme g\u00f6stergeleri, &#8220;sona ula\u015f\u0131ld\u0131&#8221; mesajlar\u0131 ve ak\u0131ll\u0131 durum y\u00f6netimi gibi teknikler kullan\u0131l\u0131r.<\/p>\n<h3>RecyclerView Temelleri ve Neden Tercih Edilmeli?<\/h3>\n<p>RecyclerView, Android uygulamalar\u0131nda b\u00fcy\u00fck veri k\u00fcmelerini verimli bir \u015fekilde g\u00f6r\u00fcnt\u00fclemek i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc ve esnek bir bile\u015fendir. ListView&#8217;in yerini alm\u0131\u015ft\u0131r ve daha iyi performans, daha fazla \u00f6zelle\u015ftirilebilirlik ve daha az bellek kullan\u0131m\u0131 sunar.<\/p>\n<p>RecyclerView&#8217;\u0131n temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Adapter:<\/strong> Veri k\u00fcmesini al\u0131r ve her bir \u00f6\u011fenin nas\u0131l g\u00f6r\u00fcnt\u00fclenece\u011fini tan\u0131mlar.<br \/>\n*   <strong>ViewHolder:<\/strong> Her bir liste \u00f6\u011fesinin g\u00f6r\u00fcn\u00fcm hiyerar\u015fisini ve \u00f6\u011fe referanslar\u0131n\u0131 tutar. ViewHolder&#8217;lar, g\u00f6r\u00fcn\u00fcm tekrar kullan\u0131m\u0131n\u0131 (view recycling) sa\u011flayarak performans\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>LayoutManager:<\/strong> Liste \u00f6\u011felerinin ekranda nas\u0131l konumland\u0131r\u0131laca\u011f\u0131n\u0131 ve kayd\u0131rma davran\u0131\u015f\u0131n\u0131 y\u00f6netir (\u00f6rn. <code>LinearLayoutManager<\/code> dikey\/yatay liste, <code>GridLayoutManager<\/code> \u0131zgara, <code>StaggeredGridLayoutManager<\/code> farkl\u0131 boyutlarda \u0131zgara).<br \/>\n*   <strong>ItemDecoration:<\/strong> \u00d6\u011feler aras\u0131na ay\u0131r\u0131c\u0131lar eklemek veya \u00f6\u011felerin kenar bo\u015fluklar\u0131n\u0131 ayarlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>ItemAnimator:<\/strong> \u00d6\u011felerin eklenmesi, \u00e7\u0131kar\u0131lmas\u0131 veya ta\u015f\u0131nmas\u0131 gibi durumlarda animasyonlar sa\u011flar.<\/p>\n<p>Sonsuz kayd\u0131rma i\u00e7in RecyclerView&#8217;\u0131 tercih etmemizin ba\u015fl\u0131ca nedenleri:<\/p>\n<p>*   <strong>Verimli G\u00f6r\u00fcn\u00fcm Tekrar Kullan\u0131m\u0131:<\/strong> Sadece ekranda g\u00f6r\u00fcnen \u00f6\u011feler i\u00e7in View olu\u015fturulur ve kayd\u0131rma s\u0131ras\u0131nda ekran d\u0131\u015f\u0131na \u00e7\u0131kan View&#8217;lar geri d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek yeni \u00f6\u011feler i\u00e7in kullan\u0131l\u0131r. Bu, bellek kullan\u0131m\u0131n\u0131 ve UI gecikmelerini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<br \/>\n*   <strong>Esnek LayoutManager:<\/strong> Farkl\u0131 d\u00fczen y\u00f6neticileri sayesinde, kayd\u0131rma davran\u0131\u015f\u0131n\u0131 ve \u00f6\u011felerin yerle\u015fimini kolayca \u00f6zelle\u015ftirebiliriz. <code>LinearLayoutManager<\/code> sonsuz kayd\u0131rma i\u00e7in genellikle en uygun olan\u0131d\u0131r.<br \/>\n*   <strong>\u00d6zelle\u015ftirilebilir Adapter:<\/strong> Adapter, farkl\u0131 t\u00fcrde \u00f6\u011feleri (\u00f6rn. veri \u00f6\u011feleri ve y\u00fckleme g\u00f6stergesi) kolayca y\u00f6netmemizi sa\u011flar.<\/p>\n<h3>Sonsuz Kayd\u0131rma Mant\u0131\u011f\u0131: Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Sonsuz kayd\u0131rma mekanizmas\u0131, temelde a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<p>1.  <strong>Kayd\u0131rma Olay\u0131n\u0131 Dinleme:<\/strong> RecyclerView&#8217;\u0131n kayd\u0131rma olaylar\u0131n\u0131 dinlemek i\u00e7in bir <code>RecyclerView.OnScrollListener<\/code> kullan\u0131l\u0131r.<br \/>\n2.  <strong>Kayd\u0131rma Sonunu Tespit Etme:<\/strong> Kullan\u0131c\u0131n\u0131n listenin sonuna yakla\u015f\u0131p yakla\u015fmad\u0131\u011f\u0131n\u0131 belirlemek. Bu genellikle <code>LayoutManager<\/code> arac\u0131l\u0131\u011f\u0131yla g\u00f6r\u00fcnen son \u00f6\u011fenin konumunu kontrol ederek yap\u0131l\u0131r.<br \/>\n3.  <strong>Y\u00fckleme Durumu Y\u00f6netimi:<\/strong> Yeni veri y\u00fcklemesi devam ederken ayn\u0131 anda birden fazla y\u00fckleme iste\u011fi g\u00f6ndermeyi \u00f6nlemek i\u00e7in bir bayrak (\u00f6rn. <code>isLoading<\/code>) kullan\u0131l\u0131r.<br \/>\n4.  <strong>Veri Y\u00fckleme:<\/strong> Listenin sonuna yakla\u015f\u0131ld\u0131\u011f\u0131nda ve bir y\u00fckleme devam etmiyorsa, sunucudan veya yerel bir kaynaktan yeni veri istenir.<br \/>\n5.  <strong>Y\u00fckleme G\u00f6stergesi:<\/strong> Veri y\u00fcklenirken kullan\u0131c\u0131ya geri bildirim sa\u011flamak i\u00e7in ge\u00e7ici bir y\u00fckleme g\u00f6stergesi (\u00f6rn. <code>ProgressBar<\/code>) g\u00f6sterilir.<br \/>\n6.  <strong>Adapter G\u00fcncelleme:<\/strong> Yeni veri al\u0131nd\u0131\u011f\u0131nda, Adapter g\u00fcncellenir ve yeni \u00f6\u011feler listeye eklenir. Y\u00fckleme g\u00f6stergesi kald\u0131r\u0131l\u0131r.<br \/>\n7.  <strong>Son Sayfa Kontrol\u00fc:<\/strong> Sunucudan art\u0131k y\u00fcklenecek veri kalmad\u0131\u011f\u0131nda (son sayfaya ula\u015f\u0131ld\u0131\u011f\u0131nda) daha fazla y\u00fckleme iste\u011fi yap\u0131lmas\u0131n\u0131 durdurmak i\u00e7in bir bayrak (\u00f6rn. <code>isLastPage<\/code>) kullan\u0131l\u0131r.<\/p>\n<h3>Ad\u0131m Ad\u0131m Uygulama Rehberi<\/h3>\n<p>\u015eimdi bu mant\u0131\u011f\u0131 Android projemizde nas\u0131l uygulayaca\u011f\u0131m\u0131za bakal\u0131m.<\/p>\n<h4>1. Proje Kurulumu ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h4>\n<p>Yeni bir Android projesi olu\u015fturun ve <code>build.gradle (Module: app)<\/code> dosyan\u0131za RecyclerView ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyin:<\/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 kullan\u0131n\n    implementation 'androidx.cardview:cardview:1.0.0' \/\/ \u0130ste\u011fe ba\u011fl\u0131, \u00f6\u011feler i\u00e7in CardView kullanmak isterseniz\n}<\/code><\/pre>\n<h4>2. Veri Modeli<\/h4>\n<p>Liste \u00f6\u011felerimizi temsil edecek basit bir veri s\u0131n\u0131f\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">\/\/ Item.java\npublic class Item {\n    private int id;\n    private String title;\n    private String description;\n\n    public Item(int id, String title, String description) {\n        this.id = id;\n        this.title = title;\n        this.description = description;\n    }\n\n    public int getId() { return id; }\n    public String getTitle() { return title; }\n    public String getDescription() { return description; }\n\n    public void setId(int id) { this.id = id; }\n    public void setTitle(String title) { this.title = title; }\n    public void setDescription(String description) { this.description = description; }\n}<\/code><\/pre>\n<h4>3. Liste \u00d6\u011fesi D\u00fczenleri (Layouts)<\/h4>\n<p>\u0130ki farkl\u0131 d\u00fczen dosyas\u0131na ihtiyac\u0131m\u0131z olacak: biri normal veri \u00f6\u011feleri i\u00e7in, di\u011feri ise y\u00fckleme g\u00f6stergesi i\u00e7in.<\/p>\n<p><strong><code>item_list.xml<\/code> (Normal \u00f6\u011fe d\u00fczeni):<\/strong><\/p>\n<pre><code class=\"language-xml\">&lt;androidx.cardview.widget.CardView\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;\n    android:layout_margin=&quot;8dp&quot;\n    app:cardCornerRadius=&quot;8dp&quot;\n    app:cardElevation=&quot;4dp&quot;&gt;\n\n    &lt;LinearLayout\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:orientation=&quot;vertical&quot;\n        android:padding=&quot;16dp&quot;&gt;\n\n        &lt;TextView\n            android:id=&quot;@+id\/item_title&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:textStyle=&quot;bold&quot;\n            android:textSize=&quot;18sp&quot;\n            android:textColor=&quot;@android:color\/black&quot;\n            android:text=&quot;Item Title&quot;\/&gt;\n\n        &lt;TextView\n            android:id=&quot;@+id\/item_description&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:layout_marginTop=&quot;4dp&quot;\n            android:textSize=&quot;14sp&quot;\n            android:textColor=&quot;@android:color\/darker_gray&quot;\n            android:text=&quot;Item Description goes here.&quot;\/&gt;\n\n    &lt;\/LinearLayout&gt;\n\n&lt;\/androidx.cardview.widget.CardView&gt;<\/code><\/pre>\n<p><strong><code>item_loading.xml<\/code> (Y\u00fckleme g\u00f6stergesi d\u00fczeni):<\/strong><\/p>\n<pre><code class=\"language-xml\">&lt;LinearLayout\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;\n    android:orientation=&quot;vertical&quot;\n    android:gravity=&quot;center&quot;\n    android:padding=&quot;16dp&quot;&gt;\n\n    &lt;ProgressBar\n        android:id=&quot;@+id\/progressBar&quot;\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\/&gt;\n\n    &lt;TextView\n        android:layout_width=&quot;wrap_content&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:layout_marginTop=&quot;8dp&quot;\n        android:text=&quot;Y\u00fckleniyor...&quot;\/&gt;\n\n&lt;\/LinearLayout&gt;<\/code><\/pre>\n<h4>4. RecyclerView Adapter<\/h4>\n<p>Adapter, iki farkl\u0131 View t\u00fcr\u00fcn\u00fc y\u00f6netebilmelidir: normal \u00f6\u011feler ve y\u00fckleme g\u00f6stergesi.<\/p>\n<pre><code class=\"language-java\">\/\/ MyAdapter.java\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MyAdapter extends RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt; {\n\n    private final int VIEW_TYPE_ITEM = 0;\n    private final int VIEW_TYPE_LOADING = 1;\n\n    private List&lt;Item&gt; itemList;\n    private boolean isLoadingAdded = false; \/\/ Y\u00fckleme g\u00f6stergesinin eklenip eklenmedi\u011fini tutar\n\n    public MyAdapter() {\n        itemList = new ArrayList&lt;&gt;();\n    }\n\n    @NonNull\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        if (viewType == VIEW_TYPE_ITEM) {\n            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);\n            return new ItemViewHolder(view);\n        } else {\n            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_loading, parent, false);\n            return new LoadingViewHolder(view);\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {\n        if (holder instanceof ItemViewHolder) {\n            Item item = itemList.get(position);\n            ((ItemViewHolder) holder).bind(item);\n        } else if (holder instanceof LoadingViewHolder) {\n            \/\/ Y\u00fckleme g\u00f6stergesi i\u00e7in \u00f6zel bir ba\u011flama i\u015flemi yok, sadece g\u00f6r\u00fcn\u00fcr olmas\u0131 yeterli.\n            \/\/ \u0130sterseniz burada ProgressBar'\u0131n animasyonunu ba\u015flatabilirsiniz.\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return itemList == null ? 0 : itemList.size();\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        \/\/ Son \u00f6\u011fe y\u00fckleme g\u00f6stergesiyse VIEW_TYPE_LOADING d\u00f6nd\u00fcr\u00fcr\n        return (position == itemList.size() - 1 &amp;&amp; isLoadingAdded) ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;\n    }\n\n    \/\/region Helper Methods for Data Management\n    public void add(Item item) {\n        itemList.add(item);\n        notifyItemInserted(itemList.size() - 1);\n    }\n\n    public void addAll(List&lt;Item&gt; newItems) {\n        int oldSize = itemList.size();\n        itemList.addAll(newItems);\n        notifyItemRangeInserted(oldSize, newItems.size());\n    }\n\n    public void remove(Item item) {\n        int position = itemList.indexOf(item);\n        if (position &gt; -1) {\n            itemList.remove(position);\n            notifyItemRemoved(position);\n        }\n    }\n\n    public void clear() {\n        isLoadingAdded = false;\n        while (getItemCount() &gt; 0) {\n            remove(getItem(0));\n        }\n    }\n\n    public Item getItem(int position) {\n        return itemList.get(position);\n    }\n\n    public List&lt;Item&gt; getItems() {\n        return itemList;\n    }\n\n    public void addLoadingFooter() {\n        isLoadingAdded = true;\n        add(new Item(-1, &quot;loading&quot;, &quot;loading&quot;)); \/\/ Dummy item for loading indicator\n    }\n\n    public void removeLoadingFooter() {\n        isLoadingAdded = false;\n        int position = itemList.size() - 1;\n        Item item = getItem(position);\n        if (item.getId() == -1) { \/\/ Check if it's our dummy loading item\n            itemList.remove(position);\n            notifyItemRemoved(position);\n        }\n    }\n\n    public boolean isLoadingAdded() {\n        return isLoadingAdded;\n    }\n    \/\/endregion\n\n    \/\/region ViewHolders\n    public static class ItemViewHolder extends RecyclerView.ViewHolder {\n        TextView itemTitle;\n        TextView itemDescription;\n\n        public ItemViewHolder(@NonNull View itemView) {\n            super(itemView);\n            itemTitle = itemView.findViewById(R.id.item_title);\n            itemDescription = itemView.findViewById(R.id.item_description);\n        }\n\n        public void bind(Item item) {\n            itemTitle.setText(item.getTitle());\n            itemDescription.setText(item.getDescription());\n        }\n    }\n\n    public static class LoadingViewHolder extends RecyclerView.ViewHolder {\n        ProgressBar progressBar;\n\n        public LoadingViewHolder(@NonNull View itemView) {\n            super(itemView);\n            progressBar = itemView.findViewById(R.id.progressBar);\n        }\n    }\n    \/\/endregion\n}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>VIEW_TYPE_ITEM<\/code> ve <code>VIEW_TYPE_LOADING<\/code>: \u0130ki farkl\u0131 g\u00f6r\u00fcn\u00fcm t\u00fcr\u00fcn\u00fc tan\u0131mlar.<br \/>\n*   <code>onCreateViewHolder<\/code>: <code>viewType<\/code> de\u011ferine g\u00f6re do\u011fru <code>ViewHolder<\/code>&#8216;\u0131 \u015fi\u015firir.<br \/>\n*   <code>onBindViewHolder<\/code>: <code>ViewHolder<\/code>&#8216;\u0131n t\u00fcr\u00fcne g\u00f6re \u00f6\u011feleri ba\u011flar.<br \/>\n*   <code>getItemCount<\/code>: Liste boyutunu d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>getItemViewType<\/code>: Belirli bir konumdaki \u00f6\u011fenin t\u00fcr\u00fcn\u00fc belirler. E\u011fer son \u00f6\u011fe ve <code>isLoadingAdded<\/code> do\u011fru ise, bu bir y\u00fckleme g\u00f6stergesidir.<br \/>\n*   <code>addLoadingFooter()<\/code>: Listenin sonuna sahte bir \u00f6\u011fe (y\u00fckleme g\u00f6stergesi) ekler.<br \/>\n*   <code>removeLoadingFooter()<\/code>: Listenin sonundaki y\u00fckleme g\u00f6stergesini kald\u0131r\u0131r.<br \/>\n*   <code>isLoadingAdded<\/code>: Y\u00fckleme g\u00f6stergesinin \u015fu anda listede olup olmad\u0131\u011f\u0131n\u0131 belirten bayrak.<\/p>\n<h4>5. Aktivite veya Fragment (MainActivity)<\/h4>\n<p>\u015eimdi <code>MainActivity<\/code> i\u00e7inde RecyclerView&#8217;\u0131 ve sonsuz kayd\u0131rma mant\u0131\u011f\u0131n\u0131 uygulayal\u0131m.<\/p>\n<p><strong><code>activity_main.xml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-xml\">&lt;RelativeLayout\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    tools:context=&quot;.MainActivity&quot;&gt;\n\n    &lt;androidx.recyclerview.widget.RecyclerView\n        android:id=&quot;@+id\/recyclerView&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot;\n        android:scrollbars=&quot;vertical&quot;\/&gt;\n\n&lt;\/RelativeLayout&gt;<\/code><\/pre>\n<p><strong><code>MainActivity.java<\/code>:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ MainActivity.java\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private static final String TAG = &quot;MainActivity&quot;;\n    private RecyclerView recyclerView;\n    private MyAdapter adapter;\n    private LinearLayoutManager layoutManager;\n\n    private boolean isLoading = false;\n    private boolean isLastPage = false;\n    private int currentPage = 1;\n    private final int TOTAL_PAGES = 5; \/\/ Toplam sayfa say\u0131s\u0131 (sim\u00fclasyon i\u00e7in)\n    private final int PAGE_SIZE = 10; \/\/ Her sayfada y\u00fcklenecek \u00f6\u011fe say\u0131s\u0131\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        layoutManager = new LinearLayoutManager(this);\n        recyclerView.setLayoutManager(layoutManager);\n\n        adapter = new MyAdapter();\n        recyclerView.setAdapter(adapter);\n\n        \/\/ \u0130lk veri y\u00fcklemesini ba\u015flat\n        loadFirstPage();\n\n        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n            }\n\n            @Override\n            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n\n                int visibleItemCount = layoutManager.getChildCount();\n                int totalItemCount = layoutManager.getItemCount();\n                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();\n\n                \/\/ Sonsuz kayd\u0131rma mant\u0131\u011f\u0131\n                if (!isLoading &amp;&amp; !isLastPage) {\n                    if ((visibleItemCount + firstVisibleItemPosition) &gt;= totalItemCount\n                            &amp;&amp; firstVisibleItemPosition &gt;= 0\n                            &amp;&amp; totalItemCount &gt;= PAGE_SIZE) { \/\/ Sadece ba\u015flang\u0131\u00e7ta az \u00f6\u011fe varsa y\u00fckleme yapmamak i\u00e7in\n                        loadMoreItems();\n                    }\n                }\n            }\n        });\n    }\n\n    private void loadFirstPage() {\n        Log.d(TAG, &quot;loadFirstPage: &quot;);\n        isLoading = true;\n        \/\/ Sim\u00fcle edilmi\u015f a\u011f iste\u011fi\n        new Handler().postDelayed(() -&gt; {\n            List&lt;Item&gt; items = generateDummyData(currentPage);\n            adapter.addAll(items);\n            isLoading = false;\n\n            if (currentPage &lt;= TOTAL_PAGES) {\n                adapter.addLoadingFooter(); \/\/ Daha fazla sayfa varsa y\u00fckleme g\u00f6stergesini ekle\n            } else {\n                isLastPage = true; \/\/ Son sayfaya ula\u015f\u0131ld\u0131\n            }\n        }, 1500); \/\/ 1.5 saniye gecikme ile sim\u00fcle et\n    }\n\n    private void loadMoreItems() {\n        Log.d(TAG, &quot;loadMoreItems: Current Page: &quot; + currentPage);\n        isLoading = true;\n        currentPage++;\n\n        \/\/ Sim\u00fcle edilmi\u015f a\u011f iste\u011fi\n        new Handler().postDelayed(() -&gt; {\n            adapter.removeLoadingFooter(); \/\/ \u00d6nceki y\u00fckleme g\u00f6stergesini kald\u0131r\n\n            List&lt;Item&gt; items = generateDummyData(currentPage);\n            adapter.addAll(items);\n            isLoading = false;\n\n            if (currentPage != TOTAL_PAGES) {\n                adapter.addLoadingFooter(); \/\/ Daha fazla sayfa varsa y\u00fckleme g\u00f6stergesini ekle\n            } else {\n                isLastPage = true; \/\/ Son sayfaya ula\u015f\u0131ld\u0131\n                Toast.makeText(this, &quot;T\u00fcm veriler y\u00fcklendi!&quot;, Toast.LENGTH_SHORT).show();\n            }\n        }, 1500); \/\/ 1.5 saniye gecikme ile sim\u00fcle et\n    }\n\n    \/\/ Sahte veri olu\u015fturan yard\u0131mc\u0131 metod\n    private List&lt;Item&gt; generateDummyData(int page) {\n        List&lt;Item&gt; dummyItems = new ArrayList&lt;&gt;();\n        int startId = (page - 1) * PAGE_SIZE + 1;\n        for (int i = 0; i &lt; PAGE_SIZE; i++) {\n            int id = startId + i;\n            dummyItems.add(new Item(id, &quot;\u00d6\u011fe &quot; + id, &quot;Bu &quot; + id + &quot;. \u00f6\u011fenin a\u00e7\u0131klamas\u0131d\u0131r.&quot;));\n        }\n        return dummyItems;\n    }\n}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>isLoading<\/code>, <code>isLastPage<\/code>, <code>currentPage<\/code>, <code>TOTAL_PAGES<\/code>, <code>PAGE_SIZE<\/code>: Y\u00fckleme durumunu, sayfalama bilgilerini ve sayfa boyutunu y\u00f6netmek i\u00e7in kullan\u0131lan de\u011fi\u015fkenler.<br \/>\n*   <code>onCreate()<\/code>: RecyclerView&#8217;\u0131 ba\u015flat\u0131r, <code>LinearLayoutManager<\/code> ve <code>MyAdapter<\/code>&#8216;\u0131 ayarlar. \u0130lk sayfay\u0131 y\u00fcklemek i\u00e7in <code>loadFirstPage()<\/code> \u00e7a\u011f\u0131r\u0131r.<br \/>\n*   <code>addOnScrollListener()<\/code>: RecyclerView&#8217;\u0131n kayd\u0131rma olaylar\u0131n\u0131 dinler.<br \/>\n*   <strong>Sonsuz Kayd\u0131rma Mant\u0131\u011f\u0131 (<code>onScrolled<\/code> i\u00e7inde):<\/strong><br \/>\n    *   <code>!isLoading && !isLastPage<\/code>: \u015eu anda bir y\u00fckleme i\u015flemi yoksa ve son sayfaya ula\u015f\u0131lmam\u0131\u015fsa devam et.<br \/>\n    *   <code>visibleItemCount + firstVisibleItemPosition >= totalItemCount<\/code>: Ekranda g\u00f6r\u00fcnen \u00f6\u011fe say\u0131s\u0131 ile ilk g\u00f6r\u00fcnen \u00f6\u011fenin konumunun toplam\u0131, toplam \u00f6\u011fe say\u0131s\u0131na e\u015fit veya b\u00fcy\u00fckse, listenin sonuna ula\u015f\u0131ld\u0131\u011f\u0131 anlam\u0131na gelir.<br \/>\n    *   <code>firstVisibleItemPosition >= 0<\/code>: Ge\u00e7erli bir konumda oldu\u011fumuzu kontrol eder.<br \/>\n    *   <code>totalItemCount >= PAGE_SIZE<\/code>: Ba\u015flang\u0131\u00e7ta liste yeterince dolmadan y\u00fckleme tetiklenmesini \u00f6nler.<br \/>\n*   <code>loadFirstPage()<\/code>: Uygulama ilk a\u00e7\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. <code>Handler().postDelayed()<\/code> ile bir a\u011f iste\u011fini sim\u00fcle eder. Veri y\u00fcklendikten sonra, daha fazla sayfa varsa y\u00fckleme g\u00f6stergesini ekler.<br \/>\n*   <code>loadMoreItems()<\/code>: Kullan\u0131c\u0131 listenin sonuna yakla\u015ft\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Mevcut y\u00fckleme g\u00f6stergesini kald\u0131r\u0131r, yeni veriyi ekler ve e\u011fer daha fazla sayfa varsa yeni bir y\u00fckleme g\u00f6stergesi ekler. E\u011fer son sayfaya ula\u015f\u0131ld\u0131ysa <code>isLastPage<\/code> bayra\u011f\u0131n\u0131 <code>true<\/code> yapar.<br \/>\n*   <code>generateDummyData()<\/code>: Sim\u00fclasyon i\u00e7in sahte <code>Item<\/code> listesi olu\u015fturur.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Manuel olarak sonsuz kayd\u0131rma uygulamak, temel senaryolar i\u00e7in yeterli olsa da, daha karma\u015f\u0131k ve sa\u011flam bir \u00e7\u00f6z\u00fcm i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>1. Android Paging K\u00fct\u00fcphanesi<\/h4>\n<p>Google, sonsuz kayd\u0131rma ve sayfalama i\u015flevselli\u011fini kolayla\u015ft\u0131rmak i\u00e7in resmi bir <code>Paging Library<\/code> sunar. Bu k\u00fct\u00fcphane, veri y\u00fckleme, durum y\u00f6netimi ve UI g\u00fcncelleme gibi bir\u00e7ok karma\u015f\u0131k detay\u0131 soyutlar.<\/p>\n<p><strong>Paging K\u00fct\u00fcphanesinin Avantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Otomatik Durum Y\u00f6netimi:<\/strong> <code>isLoading<\/code>, <code>isLastPage<\/code> gibi bayraklar\u0131 manuel olarak y\u00f6netmenize gerek kalmaz. K\u00fct\u00fcphane, y\u00fckleme durumlar\u0131n\u0131 (Y\u00fckleniyor, Hata, Bitti) otomatik olarak izler.<br \/>\n*   <strong>Veri Kaynaklar\u0131 (DataSource):<\/strong> Verinin nereden geldi\u011fine (a\u011f, veritaban\u0131, her ikisi) bak\u0131lmaks\u0131z\u0131n tutarl\u0131 bir aray\u00fcz sa\u011flar.<br \/>\n*   <strong>DiffUtil Entegrasyonu:<\/strong> Verimli liste g\u00fcncellemeleri i\u00e7in <code>DiffUtil<\/code>&#8216;i otomatik olarak kullan\u0131r, bu da UI performans\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>RxJava\/Coroutines Deste\u011fi:<\/strong> Asenkron veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netmenizi sa\u011flar.<br \/>\n*   <strong>\u00d6nbellekleme:<\/strong> Verileri \u00f6nbelle\u011fe alarak daha iyi performans sunar.<\/p>\n<p><strong>Paging K\u00fct\u00fcphanesi ile Uygulama Ad\u0131mlar\u0131 (K\u0131saca):<\/strong><\/p>\n<p>1.  <strong>Ba\u011f\u0131ml\u0131l\u0131k Ekleme:<\/strong> <code>androidx.paging:paging-runtime:X.Y.Z<\/code><br \/>\n2.  <strong><code>PagingSource<\/code> Olu\u015fturma:<\/strong> Veri kayna\u011f\u0131n\u0131z\u0131 tan\u0131mlayan bir s\u0131n\u0131f. A\u011fdan veya veritaban\u0131ndan nas\u0131l veri al\u0131naca\u011f\u0131n\u0131 ve sayfalama mant\u0131\u011f\u0131n\u0131 i\u00e7erir.<br \/>\n3.  <strong><code>Pager<\/code> ve <code>PagingData<\/code>:<\/strong> <code>Pager<\/code> nesnesi, <code>PagingSource<\/code>&#8216;unuzu kullanarak <code>PagingData<\/code> ak\u0131\u015f\u0131n\u0131 olu\u015fturur.<br \/>\n4.  <strong><code>PagingDataAdapter<\/code>:<\/strong> <code>RecyclerView.Adapter<\/code> yerine <code>PagingDataAdapter<\/code> kullan\u0131rs\u0131n\u0131z. Bu adapter, <code>PagingData<\/code>&#8216;y\u0131 otomatik olarak i\u015fler ve <code>DiffUtil<\/code> ile g\u00fcncellemeleri y\u00f6netir.<br \/>\n5.  <strong><code>ViewModel<\/code>:<\/strong> <code>ViewModel<\/code> i\u00e7inde <code>Pager<\/code>&#8216;\u0131 ba\u015flat\u0131r ve <code>PagingData<\/code>&#8216;y\u0131 UI&#8217;a sunars\u0131n\u0131z.<\/p>\n<p>E\u011fer projeniz daha karma\u015f\u0131k bir yap\u0131ya sahipse veya uzun vadeli bir \u00e7\u00f6z\u00fcm ar\u0131yorsan\u0131z, Paging K\u00fct\u00fcphanesi kesinlikle manuel uygulamaya g\u00f6re daha sa\u011flam ve bak\u0131m\u0131 kolay bir se\u00e7enektir.<\/p>\n<h4>2. Hata Y\u00f6netimi ve Tekrar Deneme<\/h4>\n<p>A\u011f istekleri her zaman ba\u015far\u0131l\u0131 olmayabilir. Hata durumlar\u0131n\u0131 ele almak ve kullan\u0131c\u0131ya bir tekrar deneme se\u00e7ene\u011fi sunmak \u00f6nemlidir.<\/p>\n<p>*   <strong>Hata G\u00f6stergesi:<\/strong> Y\u00fckleme g\u00f6stergesi yerine bir hata mesaj\u0131 ve &#8220;Tekrar Dene&#8221; d\u00fc\u011fmesi g\u00f6sterilebilir.<br \/>\n*   <strong><code>onScrollListener<\/code> i\u00e7inde:<\/strong> <code>loadMoreItems()<\/code> \u00e7a\u011fr\u0131s\u0131 ba\u015far\u0131s\u0131z oldu\u011funda, <code>isLoading<\/code> bayra\u011f\u0131n\u0131 tekrar <code>false<\/code> yaparak kullan\u0131c\u0131n\u0131n tekrar kayd\u0131rmas\u0131 veya &#8220;Tekrar Dene&#8221; d\u00fc\u011fmesine t\u0131klamas\u0131 ile yeni bir istek g\u00f6ndermesine izin verilir.<br \/>\n*   <strong>Adapter&#8217;da Hata \u00d6\u011fesi:<\/strong> Adapter&#8217;a <code>VIEW_TYPE_ERROR<\/code> ad\u0131nda \u00fc\u00e7\u00fcnc\u00fc bir g\u00f6r\u00fcn\u00fcm t\u00fcr\u00fc ekleyebilir ve bir hata durumunda bu \u00f6\u011feyi g\u00f6sterebilirsiniz.<\/p>\n<h4>3. Bo\u015f Durum (Empty State)<\/h4>\n<p>E\u011fer ba\u015flang\u0131\u00e7ta y\u00fcklenecek hi\u00e7 veri yoksa, kullan\u0131c\u0131ya bilgi veren bir &#8220;Veri Bulunamad\u0131&#8221; mesaj\u0131 veya ilgili bir ill\u00fcstrasyon g\u00f6stermek iyi bir kullan\u0131c\u0131 deneyimi sa\u011flar. Bu genellikle <code>RecyclerView<\/code>&#8216;\u0131n g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc kontrol ederek ve bo\u015f durum g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc g\u00f6stererek yap\u0131l\u0131r.<\/p>\n<h4>4. Performans \u0130yile\u015ftirmeleri<\/h4>\n<p>*   <strong><code>DiffUtil<\/code> Kullan\u0131m\u0131:<\/strong> <code>MyAdapter<\/code> \u00f6rne\u011fimizde <code>notifyItemRangeInserted<\/code> kullan\u0131ld\u0131. Bu, do\u011fru \u00e7al\u0131\u015fsa da, listelerdeki de\u011fi\u015fiklikleri daha verimli bir \u015fekilde hesaplamak i\u00e7in <code>DiffUtil<\/code> kullanmak daha iyidir. <code>DiffUtil<\/code>, sadece de\u011fi\u015fen, eklenen veya silinen \u00f6\u011feleri g\u00fcncelleyerek animasyonlar\u0131 daha p\u00fcr\u00fczs\u00fcz hale getirir ve performans\u0131 art\u0131r\u0131r. Paging K\u00fct\u00fcphanesi bunu otomatik olarak yapar.<br \/>\n*   <strong>\u00d6n Y\u00fckleme (Prefetching):<\/strong> <code>LayoutManager<\/code>&#8216;a <code>setInitialPrefetchItemCount()<\/code> gibi y\u00f6ntemlerle, kullan\u0131c\u0131 kayd\u0131rmadan \u00f6nce belirli say\u0131da \u00f6\u011feyi \u00f6nceden y\u00fcklemesini s\u00f6yleyebilirsiniz. Bu, kayd\u0131rma deneyimini daha ak\u0131c\u0131 hale getirebilir.<br \/>\n*   <strong>Debouncing Scroll Events:<\/strong> \u00c7ok h\u0131zl\u0131 kayd\u0131rma durumunda, <code>onScrolled<\/code> metodu \u00e7ok s\u0131k tetiklenebilir. Belirli bir zaman aral\u0131\u011f\u0131nda yaln\u0131zca bir kez y\u00fckleme iste\u011fi g\u00f6ndermek i\u00e7in debouncing (olaylar\u0131 geciktirme) teknikleri kullan\u0131labilir.<\/p>\n<h4>5. Mimari Yakla\u015f\u0131m<\/h4>\n<p>Veri y\u00fckleme ve UI g\u00fcncelleme mant\u0131\u011f\u0131n\u0131 <code>Activity<\/code> veya <code>Fragment<\/code> i\u00e7inden ay\u0131rmak, daha temiz ve s\u00fcrd\u00fcr\u00fclebilir bir kod taban\u0131 olu\u015fturur. MVVM (Model-View-ViewModel) gibi mimari desenler kullanmak, bu ayr\u0131m\u0131 sa\u011flamak i\u00e7in idealdir. <code>ViewModel<\/code>, ya\u015fam d\u00f6ng\u00fcs\u00fc fark\u0131ndal\u0131\u011f\u0131na sahip veri tutma ve i\u015f mant\u0131\u011f\u0131 i\u00e7in kullan\u0131l\u0131rken, <code>LiveData<\/code> veya <code>Flow<\/code> gibi reaktif ak\u0131\u015flar UI&#8217;a veri g\u00fcncellemelerini sa\u011flar.<\/p>\n<p>*   <strong><code>ViewModel<\/code>:<\/strong> Veri y\u00fckleme, sayfalama durumu (<code>currentPage<\/code>, <code>isLoading<\/code>, <code>isLastPage<\/code>) ve a\u011f isteklerini y\u00f6netir.<br \/>\n*   <strong><code>LiveData<\/code> \/ <code>Flow<\/code>:<\/strong> <code>ViewModel<\/code>&#8216;dan gelen veriyi <code>Activity<\/code>\/<code>Fragment<\/code>&#8216;a g\u00f6zlemlenebilir bir \u015fekilde iletir.<br \/>\n*   <strong>Repository:<\/strong> Veri kayna\u011f\u0131 (a\u011f, veritaban\u0131) ile <code>ViewModel<\/code> aras\u0131ndaki soyutlama katman\u0131.<\/p>\n<p>Bu yap\u0131, uygulaman\u0131n test edilebilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h4>6. Ekran Y\u00f6n\u00fc De\u011fi\u015fiklikleri ve Durum Kaydetme<\/h4>\n<p>Cihaz\u0131n ekran y\u00f6n\u00fc de\u011fi\u015fti\u011finde (portre\/yatay), <code>Activity<\/code> yeniden olu\u015fturulur ve t\u00fcm durum (y\u00fckl\u00fc \u00f6\u011feler, <code>currentPage<\/code>, <code>isLoading<\/code> vb.) kaybolur. Bu durumu \u00f6nlemek i\u00e7in:<\/p>\n<p>*   <strong><code>ViewModel<\/code> Kullan\u0131m\u0131:<\/strong> <code>ViewModel<\/code>&#8216;lar, ya\u015fam d\u00f6ng\u00fcs\u00fc de\u011fi\u015fikliklerinden etkilenmezler ve <code>Activity<\/code> yeniden olu\u015fturulsa bile veriyi tutarlar. Bu nedenle sayfalama durumlar\u0131n\u0131 <code>ViewModel<\/code> i\u00e7inde saklamak en iyi yakla\u015f\u0131md\u0131r.<br \/>\n*   <strong><code>onSaveInstanceState()<\/code> \/ <code>onRestoreInstanceState()<\/code>:<\/strong> Geleneksel olarak, basit durumlar\u0131 kaydetmek i\u00e7in kullan\u0131l\u0131r, ancak b\u00fcy\u00fck veri k\u00fcmeleri i\u00e7in uygun de\u011fildir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Android RecyclerView ile sonsuz kayd\u0131rma ve daha fazla y\u00fckleme (load more) mekanizmas\u0131, b\u00fcy\u00fck veri k\u00fcmelerini verimli ve kullan\u0131c\u0131 dostu bir \u015fekilde sunmak i\u00e7in vazge\u00e7ilmez bir tekniktir. Manuel uygulama, temel senaryolar i\u00e7in iyi bir ba\u015flang\u0131\u00e7 noktas\u0131 olsa da, Android Paging K\u00fct\u00fcphanesi gibi resmi \u00e7\u00f6z\u00fcmler, daha karma\u015f\u0131k ve sa\u011flam uygulamalar i\u00e7in \u00f6nerilen yoldur.<\/p>\n<p>Bu makalede, sonsuz kayd\u0131rma mant\u0131\u011f\u0131n\u0131n temellerini, RecyclerView ile ad\u0131m ad\u0131m nas\u0131l uygulanaca\u011f\u0131n\u0131 ve hata y\u00f6netimi, performans optimizasyonlar\u0131 ve mimari yakla\u015f\u0131mlar gibi geli\u015fmi\u015f konular\u0131 ele ald\u0131k. Do\u011fru uygulamayla, kullan\u0131c\u0131lar\u0131n\u0131za ak\u0131c\u0131, h\u0131zl\u0131 ve kesintisiz bir i\u00e7erik ke\u015ffetme deneyimi sunabilirsiniz. Unutmay\u0131n, iyi bir kullan\u0131c\u0131 deneyimi, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131n\u0131n anahtar\u0131d\u0131r.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/android-recyclerview-infinite-scroll-load-more\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/android-recyclerview-infinite-scroll-load-more<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) Mobil uygulamalarda kullan\u0131c\u0131 deneyimi (UX), uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik bir fakt\u00f6rd\u00fcr.","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-42345","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 RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) - 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-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)\" \/>\n<meta property=\"og:description\" content=\"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) Mobil uygulamalarda kullan\u0131c\u0131 deneyimi (UX), uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik bir fakt\u00f6rd\u00fcr.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-06T14:00:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-06T14:01:32+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)\",\"datePublished\":\"2026-06-06T14:00:51+00:00\",\"dateModified\":\"2026-06-06T14:01:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\"},\"wordCount\":2364,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\",\"name\":\"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-06T14:00:51+00:00\",\"dateModified\":\"2026-06-06T14:01:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)\"}]},{\"@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 RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) - 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-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/","og_locale":"tr_TR","og_type":"article","og_title":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)","og_description":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) Mobil uygulamalarda kullan\u0131c\u0131 deneyimi (UX), uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik bir fakt\u00f6rd\u00fcr.","og_url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-06T14:00:51+00:00","article_modified_time":"2026-06-06T14:01:32+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)","datePublished":"2026-06-06T14:00:51+00:00","dateModified":"2026-06-06T14:01:32+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/"},"wordCount":2364,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/","url":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/","name":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-06T14:00:51+00:00","dateModified":"2026-06-06T14:01:32+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-recyclerview-ile-sonsuz-kaydirma-ve-daha-fazla-yukleme-load-more\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android RecyclerView ile Sonsuz Kayd\u0131rma ve Daha Fazla Y\u00fckleme (Load More)"}]},{"@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\/42345","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=42345"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42345\/revisions"}],"predecessor-version":[{"id":42347,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42345\/revisions\/42347"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}