यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
हजारों आइटम वाली वर्चुअल सूची कैसे दिखाएँ
उद्देश्य. प्रति पंक्ति एक Component बनाए बिना हजारों आइटम दिखाएँ। VirtualListView
केवल दृश्यमान views को बनाता/रेंडर करता है और जो स्क्रीन से बाहर जाती हैं उन्हें रीसायकल करता है
(जैसे Android का RecyclerView)। सभी पंक्तियों की ऊँचाई निश्चित होती है (Relative itemHeight)।
उपयोग की गई APIs
new VirtualListView(Relative itemHeight, DataAdapter adapter)— एकमात्र कंस्ट्रक्टर; ऊँचाई सभी पंक्तियों के लिए निश्चित है।interface DataAdapter(VirtualListViewमें nested), जिसमें तीन मेथड हैं:int getCount()— कुल आइटम।Component createView() throws Exception— एक खाली view बनाता है; केवल तब बुलाया जाता है जब रीसायकल पूल खाली हो।void bindView(Component view, int index) throws Exception— एक view (नई या रीसायकल की गई) को इंडेक्स के डेटा से भरता है।
VirtualListView.notifyDataChanged()— dataset के नए इंडेक्स के अंतर्गत बढ़ने/बदलने के बाद इसे कॉल करें (जैसे: संलग्न किया गया पृष्ठ)। यह पहले से दृश्यमान पंक्तियों को दोबारा बाइंड नहीं करता।VirtualListView.reloadData()— पूर्ण पुनर्भार: views का कैश हटाता है, सब कुछ रीसायकल करता है, शीर्ष पर स्क्रॉल करता है और सभी दृश्यमान स्लॉट को दोबारा बाइंड करता है। खोज/फ़िल्टर/क्रमबद्धता में उपयोग करें (समान इंडेक्स के अंतर्गत सामग्री बदलती है)।VirtualListView.scrollToIndex(int index)— इंडेक्स को केंद्रित करने तक स्क्रॉल करता है।VirtualListView.getScrollY()— वर्तमान ऊर्ध्वाधर ऑफसेट पिक्सेल में (कोलैप्स होने वाले हेडर के लिए उपयोगी)।
पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
package com.exemplo;
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
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
final String[] dados = new String[50_000];
for (int i = 0; i < dados.length; i++) dados[i] = "Registro " + i;
Relative alturaItem = Relative.ofFont(3f); // प्रति पंक्ति ~3 फ़ॉन्ट ऊँचाई (UI के साथ स्केल होता है)
VirtualListView lista = new VirtualListView(alturaItem, new VirtualListView.DataAdapter()
{
public int getCount()
{
return dados.length;
}
public Component createView() throws Exception
{
// पुन: उपयोग योग्य "खाली" view — यहाँ कोई डेटा नहीं
return new Label("");
}
public void bindView(Component view, int index) throws Exception
{
// रिसाइकल किए गए view को वर्तमान index के डेटा से भरें
((Label) view).setText(dados[index]);
}
});
add(LAY_FILL, lista);
}
}
नीचे का अंश केवल मुख्य भाग दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए
MainWindowढाँचे में रखें।
न्यूनतम अंश
// स्रोत में सत्यापित: VirtualListView.java (DataAdapter एक नेस्टेड interface है)
final String[] dados = new String[50_000];
for (int i = 0; i < dados.length; i++) dados[i] = "Registro " + i;
Relative alturaItem = Relative.ofFont(3f); // प्रति पंक्ति ~3 फ़ॉन्ट ऊँचाई (UI के साथ स्केल होता है)
VirtualListView lista = new VirtualListView(alturaItem, new VirtualListView.DataAdapter()
{
public int getCount()
{
return dados.length;
}
public Component createView() throws Exception
{
// पुन: उपयोग योग्य "खाली" view — यहाँ कोई डेटा नहीं
return new Label("");
}
public void bindView(Component view, int index) throws Exception
{
// रिसाइकल किए गए view को वर्तमान index के डेटा से भरें
((Label) view).setText(dados[index]);
}
});
layout.add(1f, lista);
डेटा अपडेट करना:
// अंत में और आइटम जोड़े (नए index) → notifyDataChanged
carregarMaisDados(dados);
lista.notifyDataChanged();
// एक फ़िल्टर/खोज लागू किया (वही index, अलग कंटेंट) → reloadData
aplicarFiltro();
lista.reloadData(); // रिसाइकल करता है, ऊपर लौटता है और दृश्यमान को फिर से bind करता है
और गहराई में जाएँ
- अनिवार्य नियम: बाइंड के बीच views के संदर्भ कभी न रखें — वे अन्य इंडेक्स के लिए रीसायकल की जाती हैं।
- कई तत्वों वाली पंक्ति (आइकन + टेक्स्ट + मान)? एक कस्टम
Componentबनाएँ जिसमें एकbind(...)मेथड हो जो उप-संदर्भों को फ़ील्ड के रूप में रखे:createView()new CardTarefa()लौटाता है औरbindView((CardTarefa) view).bind(dados[index])करता है (देखें कंपोनेंट्स में सोचना)। - सर्वर से पृष्ठ-दर-पृष्ठ आने वाला डेटा: देखें paginacao.md (
PagedDataAdapterका उपयोग करता है)। - append द्वारा अनंत स्क्रॉल: देखें carregar-mais.md।
- विजेट गाइड: VirtualListView · सर्वोत्तम अभ्यास: प्रदर्शन और बड़ी सूचियाँ · आधिकारिक स्रोत: अध्याय 15
क्या यह पृष्ठ उपयोगी था?प्रतिक्रिया के लिए धन्यवाद!