7

मुझे नेटवर्क से डेटा के साथ एक लंबे ListView को पॉप्युलेट करने की आवश्यकता है, पूरे डेटा संग्रह के लिए 2-3 सेकंड कहें। मैं नहीं चाहता कि उपयोगकर्ता लोडिंग Dialog देखें और पूरी सूची डाउनलोड की प्रतीक्षा करें। इसके बजाय मैं ListView को अपडेट करना चाहता हूं क्योंकि प्रत्येक आइटम उपलब्ध हो जाता है।मैं सूची सूची में असीमित रूप से पंक्तियों को कैसे जोड़ सकता हूं?

  • मैं यह कैसे कर सकता हूं?
  • मुझे से OnProgressUpdate के साथ जोड़कर अनुमान लगाया गया है?
  • क्या मुझे प्रत्येक अतिरिक्त पंक्ति के बाद notifyDatasetChanged() जारी करना है?
  • Fragment/Loader बेहतर दृष्टिकोण है?
  • क्या इस तरह के मामले के लिए कोई ट्यूटोरियल या एपीआई डेमो संदर्भ कार्यान्वयन है?

यह महत्वपूर्ण नहीं है कि डेटा Activity मरता (यानी Service अनावश्यक है)

+0

उपयोग समर्थन पुस्तकालय से एक ListFragment, नमूने को देखो, एक निजी क्षेत्र में अपने डाटा को कैश तो notifyDatasetChanged फोन जब एक नए तत्व के लिए तैयार है – sherpya

+0

परिभाषित करें "धीरे धीरे"। क्या आप एक बड़े अंतराल पर आ रहे हैं या यह एक बड़ा डाउनलोड है? –

उत्तर

3

अब तक का सबसे अच्छा तरीका मैंने देखा है CommonsWare से। यह इस संबंधित answer में पाया गया था।

स्पष्ट रूप से notifyDatasetChanged() के बिना add पर कॉल करने में कुछ भी गलत नहीं है।

public class AsyncDemo extends ListActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
             "sit", "amet", "consectetuer", 
             "adipiscing", "elit", "morbi", 
             "vel", "ligula", "vitae", 
             "arcu", "aliquet", "mollis", 
             "etiam", "vel", "erat", 
             "placerat", "ante", 
             "porttitor", "sodales", 
             "pellentesque", "augue", 
             "purus"}; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    setListAdapter(new ArrayAdapter<String>(this, 
         android.R.layout.simple_list_item_1, 
         new ArrayList<String>())); 

    new AddStringTask().execute(); 
    } 

    class AddStringTask extends AsyncTask<Void, String, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 
     for (String item : items) { 
     publishProgress(item); 
     SystemClock.sleep(200); 
     } 

     return(null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) { 
     ((ArrayAdapter<String>)getListAdapter()).add(item[0]); 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     Toast 
     .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) 
     .show(); 
    } 
    } 
} 
0

मुझे लगता है कि तुम यहाँ प्रारंभ करने से पहले पूरी तरह से दिलवाया जा: http://www.vogella.com/articles/AndroidPerformance/article.html

तो, आप एक अतुल्यकालिक कॉल करने के लिए की जरूरत है डेटा के लिए एक सर्वर के लिए। या आप उसके लिए पृष्ठभूमि कार्य चला सकते हैं।

आप AsyncTask के लिए Google कर सकते हैं या यहां स्टैक ओवरफ्लो पर खोज सकते हैं। यहाँ उदाहरण है: AsyncTask Android example

+0

इनमें से कौन सा लिंक दिखाता है कि व्यक्तिगत पंक्तियों को असीमित रूप से कैसे जोड़ना है, जब तक कि सभी पंक्तियां आबादी नहीं आतीं? मुझे इनमें से किसी भी लिंक के बारे में कुछ भी दिखाई नहीं देता है जो प्रश्न का उत्तर देता है। –

+0

लिंक में जानकारी है, पृष्ठभूमि धागे में नौकरी कैसे करें। और कुछ जानकारी है, जीयूआई कैसे अपडेट करें। आप पृष्ठभूमि धागे से जीयूआई तत्वों को अद्यतन नहीं कर सकते हैं। दूसरे लिंक में टेक्स्ट व्यू के साथ उदाहरण है। – Guntis

0

बस सुनिश्चित करने के लिए, ListView के adapter है और न ही उसके अंतर्निहित डेटा यूआई धागा अलावा अन्य धागे से अद्यतन नहीं किया जा सकता है। अद्यतन मुख्य अनुप्रयोग धागे पर निष्पादित किया जाना चाहिए। गैर-यूआई धागे अद्यतन को आमंत्रित करने के लिए post() या runOnUiThread() आदि का उपयोग कर सकते हैं।

कॉलिंग notifyDatasetChanged() कॉलिंग की तरह यह अच्छा अभ्यास नहीं है, इसे Adapter स्वयं या ऑब्जेक्ट को डेटा बदलना चाहिए।

नेटवर्क ऑपरेशन धीमा है, इस पर विचार करें कि database में डाउनलोड किए गए डेटा को स्टोर करने के लिए यह वांछनीय नहीं है। Loader के उपयोग के साथ सबसे अच्छा CursorAdapter लागू करने के साथ आप समाप्त होने के साथ, ताकि जब आप अपने कामकाजी थ्रेड में database अपडेट करते हैं, तो ListView परिवर्तनों के बारे में स्वचालित रूप से अधिसूचित किया जाएगा।

+0

मैं विशेष रूप से डेटा प्रदर्शित करने और 'ListView' को अपडेट करने के बारे में पूछ रहा हूं क्योंकि यह उपलब्ध हो गया है, इसे पहले से इकट्ठा नहीं कर रहा है और इसे संग्रहीत नहीं कर रहा है। –

+0

जब आपका आइटम उपलब्ध हो जाता है तो आप इसे 'डेटाबेस' में डाल देते हैं और 'लिस्ट व्यू' को परिवर्तन के बारे में अधिसूचित किया जाएगा, इस मामले में उल्लिखित आइटम जोड़ा गया था, जब तक कि आप एक लेनदेन में सभी आइटम नहीं डाल रहे हों। – biegleux