14

Ich habe eine ListView an eine ArrayAdapter angeschlossen. Wenn der Benutzer auf eine Download-Schaltfläche für ein Element in der ListView klickt, beginnt ein Download mit der DownloadManager.Wie aktualisiert Fortschrittsbalken in einem ListView Artikel

Ich möchte den Download-Fortschritt mit einem Fortschrittsbalken verfolgen (im Elementlayout platziert). Wie kann dies erreicht werden?

Die Art und Weise Taschen-Cast macht es exacly ist, was ich nach:

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

Hinweis: Ich weiß, wie man mit den DownloadManager zu arbeiten, es ist die sofortige Aktualisierung des Fortschrittsbalkens, die knifflig .

Antwort

16

Dies ist die Art, wie ich es endlich gelöst (nach vielen Iterationen und verschiedene Implementierungen). Es ist ein bisschen schwierig, aber im Grunde brauchen Sie drei Dinge:

  1. Ein AsyncTask, die Meta-Daten
  2. Ein Scroll-Hörer sammelt, die uns sagt, wenn der Benutzer Scrollen gestoppt/
  3. Ein kluger Algorithmus schleudert, die jeden sichtbar findet Zeile, die den Adapter nur Updates aktualisiert werden muss, und fordert, dass bestimmte Zeile

Dies ist die Art, wie ich entworfen und implementiert es:

Screenshot

Ich schrieb ausführlicher über it here, und bitte sehen Sie die github code für die komplette Implementation.

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

Hallo, ich versuche es zu machen, aber ich habe einen Pb. Wenn ich BackButton drücke, wird die dl fortgesetzt (das ist was ich will), aber wenn ich in dieser Ansicht zurückkomme, bewegen sich progressBars nicht. Kannst du ein Beispiel für deinen Adapter nennen? Funktioniert es wie ich, wenn Sie zurück drücken und zur selben Ansicht zurückkehren? – Cocorico

+0

Ja, es funktioniert sowohl beim Start der Aktivität als auch beim Fortsetzen der Aktivität (aus einem angehaltenen Zustand). Sehen Sie sich 'private void refreshScreen()' im Quelltext hier an: https://github.com/slidese/SGU/blob/master/src/se/slide/sgu/StartActivity.java – Mike

0

Für ein bestimmtes Ansichtselement können Sie es unter Verwendung von getChildAt(int index) abrufen und aktualisieren.

Und Sie können alle sichtbaren Elemente mit Hilfe von getFirstVisiblePosition() durchqueren und getLastVisiblePosition()

+0

Aber woher wissen Sie, ob eine bestimmte Ansicht in einem herunterladbaren Zustand ist? Ich nehme an, Sie hätten eine 'AsyncTask', die den' DownloadManager' abfragt, so dass Sie nur noch 0 oder mehr Download-IDs haben, aber keine Ahnung haben, welchen 'ListView'-Elementen diese entsprechen. Oder verpasse ich hier etwas? – Mike

+0

Mit Download-IDs können Sie URIs haben (entweder indem Sie den DownloadManager oder Ihre eigene Karte, die einer Download-ID entspricht, mit einem URI abfragen). Von einer 'ListView'-Position können Sie den URI von Ihrem Adapter erhalten. So, jetzt haben Sie eine Verbindung zwischen Download-ID und 'ListView' Position. –

+0

Oder Sie können sogar eine Karte haben, die Download-IDs und 'ListView'-Positionen speichert. Diese Karte kann manipuliert werden, wenn Sie eine Anfrage mit dem 'DownloadManager' in die Warteschlange stellen. –

Verwandte Themen