14

मेरे पास ArrayAdapter से जुड़ा ListView है। जब उपयोगकर्ता ListView में किसी आइटम के लिए डाउनलोड बटन पर क्लिक करता है तो डाउनलोड DownloadManager का उपयोग शुरू होता है।किसी सूची दृश्य आइटम में प्रगति पट्टी को कैसे अपडेट करें

मैं क्या करना चाहता हूं प्रगति पट्टी (आइटम लेआउट में रखा गया) के साथ डाउनलोड प्रगति को ट्रैक करना है। यह कैसे हासिल किया जा सकता है?

रास्ता पॉकेट कास्ट यह exacly है करता है कि मैं क्या कर रहा हूँ के बाद:

Pocket Cast exampel http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg

नोट: मैं कैसे DownloadManager के साथ काम करने को पता है, यह प्रगति बार की तत्काल अद्यतन कि मुश्किल है ।

उत्तर

16

इस तरह से मैं अंत में इसे हल है (कई पुनरावृत्तियों और विभिन्न कार्यान्वयन के बाद) द्वारा सभी दृश्यमान आइटम के माध्यम से पार कर सकते हैं। यह थोड़ा मुश्किल है, लेकिन मूल रूप से आप तीन चीजों की जरूरत है:

  1. एक AsyncTask कि मेटा डेटा
  2. एक घूंघर श्रोता हमें बताता है कि जब उपयोगकर्ता स्क्रॉल बंद कर दिया है/
  3. टूट पड़नेवाला एक चतुर एल्गोरिथ्म है कि किसी भी दिखाई दे पाता बटोरता पंक्ति को अपडेट करते हुए की जरूरत है और केवल अद्यतन करने के लिए एडाप्टर विशेष पंक्ति

इस तरह से मैं बनाया गया है और इसे लागू किया है पूछता है:

Screenshot

मैंने it here के बारे में अधिक जानकारी में लिखा है, और कृपया पूर्ण अनुकरण के लिए github code देखें।

private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> { 

    boolean isRunning = true; 

    public void stop() { 
     isRunning = false; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     while (isRunning) { 

      // Gather data about your adapter objects 
      // If an object has changed, mark it as dirty     

      publishProgress(); 

      try { 
       Thread.sleep(200); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... params) { 
     super.onProgressUpdate(); 

     // Update only when we're not scrolling, and only for visible views 
     if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
      int start = mListview.getFirstVisiblePosition(); 
      for(int i = start, j = mListview.getLastVisiblePosition(); i<=j; i++) { 
       View view = mListview.getChildAt(i-start); 
       if (((Content)mListview.getItemAtPosition(i)).dirty) { 
        mListview.getAdapter().getView(i, view, mListview); // Tell the adapter to update this view 
       } 

      } 
     } 

     } 
    } 
+0

हैलो, मैं इसे बनाने की कोशिश करता हूं लेकिन मेरे पास एक पीबी है। जब मैं बैकबटन दबाता हूं, डीएल जारी रहता है (यही वह है जो मैं चाहता हूं) लेकिन जब मैं इस दृश्य में वापस आ जाता हूं, प्रगति बार्स नहीं चलता है। क्या आप अपने एडाप्टर का उदाहरण डाल सकते हैं। क्या यह मेरे जैसे काम करता है जब आप वापस दबाते हैं और उसी दृश्य पर वापस आते हैं? – Cocorico

+0

हां, यह तब काम करता है जब 'गतिविधि' शुरू होता है और जब यह गतिविधि को फिर से शुरू करता है (रुका हुआ स्थिति से)। यहां स्रोत कोड में 'निजी शून्य रीफ्रेशस्क्रीन() 'पर एक नज़र डालें: https://github.com/slidese/SGU/blob/master/src/se/slide/sgu/StartActivity.java – Mike

0

एक विशिष्ट दृश्य आइटम के लिए, आप इसे getChildAt(int index) का उपयोग करके पुनर्प्राप्त कर सकते हैं और इसे अपडेट कर सकते हैं।

और तुम getFirstVisiblePosition() की मदद और getLastVisiblePosition()

+0

लेकिन आप कैसे जानते हैं कि कोई विशिष्ट दृश्य डाउनलोड करने योग्य स्थिति में है या नहीं? मुझे लगता है कि आपके पास 'AsyncTask' होगा जो 'DownloadManager' से पूछताछ करेगा, इसलिए आपको 0 या अधिक डाउनलोड आईडी के साथ छोड़ दिया गया है, लेकिन यह नहीं पता कि' ListView' आइटम इनसे मेल खाते हैं। या मुझसे यहां कुछ छूट रहा है? – Mike

+0

डाउनलोड आईडी के साथ, आप यूआरआई (या तो डाउनलोड मैनेजर या अपना खुद का मानचित्र पूछ सकते हैं जो यूआरआई के साथ डाउनलोड आईडी से मेल खाता है)। 'ListView' स्थिति से, आप अपने एडाप्टर से यूआरआई प्राप्त कर सकते हैं। तो अब, आपके पास डाउनलोड आईडी और 'ListView' स्थिति के बीच एक लिंक है। –

+0

या आपके पास एक नक्शा भी हो सकता है जो डाउनलोड आईडी और 'ListView' स्थितियों को संग्रहीत करता हो। जब आप 'DownloadManager' के साथ अनुरोध स्वीकार करते हैं तो उस मानचित्र को छेड़छाड़ की जा सकती है। –

संबंधित मुद्दे