14

ArrayAdapter'a bağlı bir ListView sahibim. Kullanıcı, ListView'daki bir öğenin indirme düğmesini tıkladığında, indirme işlemi DownloadManager'u kullanarak başlar.ListView öğesinde progressbar nasıl güncellenir

Yapmak istediğim, indirme ilerlemesini bir ilerleme çubuğuyla (öğe düzeninde bulunur) izlemek. Bu nasıl başarılabilir?

yönlü Cep Cast o exacly olduğunu does Peşinde olduğum şey:

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

Not: Ben DownloadManager nasıl çalışılacağını biliyorum, o zor ilerleme çubuğunun anlık güncelleme var .

cevap

16

Bu nihayet çözüldü yoludur (birçok tekrarlamalar ve farklı uygulamalara sonra) tarafından tüm görünür öğeleri aracılığıyla geçebilirler. Bu biraz zor ama temelde üç şeye ihtiyacınız vardır: meta veri

  • gözle görülür bulur Akıllı bir algoritma hızla sallayarak kullanıcı kaydırma durduğunda söyler bir kaydırma dinleyici/toplar

    1. Bir AsyncTask

      : Bu benim tasarlanmış ve uygulamaya yoludur belirli satır

    sadece güncelleme adaptörü ve güncellenmesi ihtiyacı sorar satır

    it here hakkında daha ayrıntılı bir şekilde yazdım ve tam sementasyon için lütfen github code'a bakın.

    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

    ile merhaba tamam, ben yapmaya çalışıyorum ama bir pb var. BackButton'a bastığımda dl devam ediyor (istediğim bu) ama bu görüntüye geri döndüğümde progressBars hareket etmiyor. Bağdaştırıcınızın bir örneğini koyabilir misiniz? Geri basıp aynı görünüme döndüğünüzde benim gibi çalışır mı? – Cocorico

    +0

    Evet, 'Etkinlik' başladığında ve aynı zamanda (duraklatılmış durumdan) etkinliği yeniden başlattığı zaman çalışır. Kaynak kodunda 'private void refreshScreen()' ye bakın: https://github.com/slidese/SGU/blob/master/src/se/slide/sgu/StartActivity.java – Mike

    0

    Belirli bir görünüm öğesi için getChildAt(int index)'u kullanarak alabilir ve güncelleyebilirsiniz.

    Ve getFirstVisiblePosition() yardımıyla ve getLastVisiblePosition()

    +0

    Ancak belirli bir görünümün yüklenebilir durumda olup olmadığını nasıl anlarsınız? "DownloadManager" ı sorgulayacak bir "AsyncTask" 'a sahip olacağınızı varsayalım, bu yüzden 0 veya daha fazla indirme kimliğiyle ayrıldınız, ancak' ListView' öğelerinin bunlara karşılık geldiği konusunda hiçbir fikriniz yok. Yoksa burada bir şey mi özlüyorum? – Mike

    +0

    İndirme kimlikleriyle, URI'lere sahip olabilirsiniz (DownloadManager'ı veya kendi haritanızı bir URI ile bir indirme kimliğiyle eşleştirerek). 'ListView' konumundan URI'yi bağdaştırıcınızdan alabilirsiniz. Şimdi, indirme kimliği ve 'ListView' pozisyonu arasında bir bağlantınız var. –

    +0

    Ya da indirme kimliklerini ve 'ListView' konumlarını saklayan bir harita bile olabilir. 'DownloadManager' ile bir istekte bulunduğunuzda bu harita manipüle edilebilir. –