# लोड-मोर (अनंत स्क्रॉल) कैसे लागू करें

> जब उपयोगकर्ता वर्चुअल सूची के अंत के पास पहुँचे तो स्वचालित रूप से अधिक आइटम संलग्न करें।

Source: https://crossfly.dev/hi/docs/cookbook/lists/carregar-mais — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# लोड-मोर (अनंत स्क्रॉल) कैसे लागू करें

**उद्देश्य.** जैसे-जैसे उपयोगकर्ता सूची के अंत के पास पहुँचता है, स्वचालित रूप से अधिक डेटा लोड करें,
मौजूदा dataset में आइटम संलग्न करते हुए (append)। LRU कैश वाली पेजिनेशन
([paginacao.md](/docs/cookbook/lists/paginacao)) के विपरीत, यहाँ आप dataset को नियंत्रित करते हैं और सूची केवल यह
सूचित करती है कि अधिक लाने का समय कब है।

## उपयोग की गई APIs
- `VirtualListView.onLoadMore(Runnable callback)` — जब स्क्रॉल अंत के पास पहुँचता है तब ट्रिगर होता है। एक समय में केवल एक ट्रिगर लंबित रहता है (`loadMorePending`), जिससे दोहराई गई कॉल से बचा जाता है।
- `VirtualListView.loadMoreThreshold(int threshold)` — **अंत से कितने आइटम पहले** callback ट्रिगर होता है। Default `5`।
- `VirtualListView.notifyDataChanged()` — नए आइटम संलग्न करने के बाद इसे कॉल करना **अनिवार्य** है; यह `loadMorePending` को साफ़ करता है, स्पिनर को छिपाता है और सामग्री को दोबारा मापता है।

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```java
package com.exemplo;

import java.util.*;   // List / ArrayList

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.graphics.*;   // Relative (VirtualListView के लिए)

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   final List<String> dados = new ArrayList<>();
   int proxima = 0;

   /** dataset में 30 आइटम का एक बैच जोड़ता है (सर्वर के एक पेज का अनुकरण)। */
   private void carregarPagina()
   {
      for (int i = 0; i < 30; i++)
         dados.add("Registro " + (proxima++));
   }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      carregarPagina();   // पहला बैच भरता है

      VirtualListView lista = new VirtualListView(Relative.ofFont(3f), new VirtualListView.DataAdapter()
      {
         public int getCount()                    { return dados.size(); }
         public Component createView()            { return new Label(""); }
         public void bindView(Component v, int i) throws Exception
         {
            ((Label) v).setText(dados.get(i));
         }
      });

      lista.loadMoreThreshold(8);   // अंत से 8 आइटम पहले लाना शुरू करता है (डिफ़ॉल्ट 5 है)
      lista.onLoadMore(() ->
      {
         // अंत के पास आने पर एक बार ट्रिगर होता है; अगले ट्रिगर केवल notifyDataChanged के बाद
         onUI(() ->
         {
            carregarPagina();             // जोड़ता है (अंत में नए index)
            lista.notifyDataChanged();    // अगले load-more को मुक्त करता है और spinner छुपाता है
         });
      });

      add(LAY_FILL, lista);
   }
}
```

> नीचे का अंश **केवल मुख्य भाग** दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए `MainWindow` ढाँचे में रखें।

## न्यूनतम अंश
```java
// स्रोत में सत्यापित: VirtualListView.java (onLoadMore / loadMoreThreshold / notifyDataChanged)
final Array<String> dados = new Array<>();
carregarPagina(dados, 0);   // पहला बैच भरता है

VirtualListView lista = new VirtualListView(Relative.ofFont(3f), new VirtualListView.DataAdapter()
{
   public int getCount()                    { return dados.size(); }
   public Component createView()            { return new Label(""); }
   public void bindView(Component v, int i) throws Exception
   {
      ((Label) v).setText(dados.get(i));
   }
});

lista.loadMoreThreshold(8);   // अंत से 8 आइटम पहले लाना शुरू करता है (डिफ़ॉल्ट 5 है)
lista.onLoadMore(() ->
{
   // अंत के पास आने पर एक बार ट्रिगर होता है; अगले ट्रिगर केवल notifyDataChanged के बाद
   api.proximaPagina(novos ->
   {
      dados.addAll(novos);          // जोड़ता है (अंत में नए index)
      lista.notifyDataChanged();    // अगले load-more को मुक्त करता है और spinner छुपाता है
   });
});

layout.add(1f, lista);
```

## और गहराई में जाएँ
- `VirtualListView` लोड-मोर के लंबित रहने के दौरान स्वचालित रूप से **फुटर में एक स्पिनर** दिखाता है (`VirtualListViewStyle.showSpinner` द्वारा नियंत्रित)।
- यदि आप `notifyDataChanged()` को कॉल **नहीं** करते हैं, तो `loadMorePending` `true` पर अटका रहता है और callback फिर कभी ट्रिगर नहीं होता।
- सीमित कैश वाले हटाने-योग्य पृष्ठ चाहिए (अनंत append के बजाय)? उपयोग करें [paginacao.md](/docs/cookbook/lists/paginacao)।
- विजेट गाइड: [VirtualListView](/docs/ui/widgets/virtuallistview) · सहोदर रेसिपी: [lista-virtual-grande.md](/docs/cookbook/lists/lista-virtual-grande) · आधिकारिक स्रोत: अध्याय 15
