Lazy Bilder in GridView herunterladen

7

In meiner Anwendung muss ich viele Bilder von URLs herunterladen und sie in einer GridView anzeigen. (Es kann zwischen 1-200 Bildern sein). Ich möchte nicht alle Bilder gleichzeitig herunterladen. Ich lese über faulen Download und meine Frage ist: Kann ich nur einen Teil des Json, laden Sie die Bilder in einem anderen Thread, und nur wenn der Benutzer nach unten scrollen GridView, werde ich weiter zum andere Teile der JSON, und so weiter?

Bearbeiten: Hallo nochmal. Ich möchte Multi-Auswahl in diesem GridView implementieren, und ich habe Schwierigkeiten, den Code in der Methode getView () des Adapters zu implementieren. Dies ist das Beispiel, das ich benutze: Beispiel . Wie kann ich diesen Code in meiner getView () Methode kombinieren:

%Vor%

mein getView () Code:

%Vor%     
user1787773 07.11.2012, 08:01
quelle

4 Antworten

37

So hole ich mehrere Fotos in meiner Aktivität ab. Sie können Teile davon für Ihre Logik verwenden. Ich benutze dies um Facebook Bilder von einem Album zu holen. Also sind meine Bedürfnisse (ich nehme an) anders als deine Bedürfnisse. Aber auch hier kann die Logik für Sie von Nutzen sein.

Hinweis: Das wird lange dauern. ; -)

Dies sind die globalen Deklarationen zur Verwendung durch die ACtivity:

%Vor%

Dies ist der Codeblock, der den ersten Satz Bilder abruft:

%Vor%

Dies ist zu erkennen, wenn der Benutzer bis zum Ende gescrollt ist und neue Bilder abruft:

%Vor%

Und schließlich, das ist, wie ich die nächste Reihe von Bildern hole:

%Vor%

Dies ist die Hilfsklasse für SET und GET die Daten, die aus den obigen Abfragen gesammelt wurden:

%Vor%

Wenn Sie auch den Code adapter wollen, lassen Sie es mich wissen. Ich benutze Fedors Lazy Loading Methode im Adapter.

Puh. Ich hoffe, dass das hilft. Wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen. : -)

BEARBEITEN: Adaptercode hinzugefügt:

%Vor%

EDIT: Schritte hinzugefügt, um Fortschritt beim Laden anzuzeigen:

Fügen Sie eine Fortschrittsbalken zu Ihnen XML, wo Sie das GridView direkt darunter haben. Spielen Sie mit dem Gewicht herum, wenn es Probleme verursacht.

%Vor%

Deklarieren Sie in Ihrem Java das Linearlayout linlaProgressBar als Global und werfen Sie es in das onCreate() und legen Sie es als linlaProgressBar.setVisibility(View.GONE);

fest

Und in onPreExecute() verwende es wie folgt:

%Vor%

Und schließlich hinzufügen, das in onPostExecute()

%Vor%     
Siddharth Lele 07.11.2012, 08:29
quelle
3

Sie können einen Blick auf Adapteransichten verwenden und GridView aus der Android-Dokumentation. Die wichtigste Sache ist, dass der Adapter die Methode getView aufruft, wobei nur die Position der Einträge, die auf dem Bildschirm angezeigt werden, übergeben wird und nach verschiedenen Positionen gefragt wird, wenn der Benutzer scrollt.

Der einfachste Weg ist das Herunterladen des erforderlichen Bildes auf der Methode getView Ihres Adapters mit und AsyncTask .

Es gibt ein Beispiel

    
sabadow 07.11.2012 08:12
quelle
0

Aus Erfahrung ist es schwierig, ein flüssiges Scrollen (und eine allgemeine Reaktionsfähigkeit) zu erreichen, während man den Speicher vernünftig verbraucht.

Es wäre eine gute Idee zuerst nach bestehenden Lösungen zu suchen, zum Beispiel hier: Lazy Last von Bildern in ListView

Wir haben eine kundenspezifische Lösung gefunden. Es ist ein Hintergrundthread, der Downloadanforderungen in die Warteschlange stellt und nur die Bilder, die noch sichtbar sind, auf den externen Speicher herunterlädt und zwischenspeichert. Wenn ein neues Bild eintrifft, wird die Ansicht benachrichtigt und entscheidet, wann der zu aktualisierende Adapter benachrichtigt werden soll.

Es spart auch die Bandbreite, die in einigen Fällen wichtig war.

    
full.stack.ex 07.11.2012 08:31
quelle
0

Ich fand die Antwort von IceMAN sehr nützlich, aber ich empfehle auch, zwei AsyncTasks zu vermeiden, und Sie können das leicht machen.

Sie müssen eine universelle Methode zum Abrufen der benötigten Daten erstellen, in der Sie eine if / else-Bedingung (als Beispiel) eingeben können:

%Vor%

addMovies ist ein boolescher Wert in Ihrer onScroll-Methode. In AsyncTask bieten aktuelle Seite in Abfrage URL und voila - Sie haben Ihren Code kleiner gemacht:)

    
Dmytro Karataiev 17.12.2015 05:10
quelle