Lazy-laden von Bildern in gridView
In meiner Anwendung, die ich herunterladen müssen eine Menge Bilder von urls und zeigt diese in einem gridView. (Es kann zwischen 1-200 Bilder). Ich don ' T wollen, laden Sie alle Bilder auf einmal. Ich lese zu faul herunterladen und meine Frage ist: bekomme ich nur ein Teil des Json, laden Sie die Bilder in einem anderen thread, und nur, wenn der Benutzer nach unten scrollen das gridView, werde ich weiterhin die anderen Teile der Json -, und so weiter?
Edit: Hallo nochmal. Ich möchte zu implementieren multi wählen Sie in diesem gridView und ich Schwierigkeiten beim implementieren Sie den code in der getView() Methode des Adapters. Dies ist das Beispiel, das ich verwende:Beispiel. Wie kann ich die kombinieren Sie diesen code in meiner getView() Methode:
public View getView(int position, View convertView, ViewGroup parent) {
CheckableLayout l;
ImageView i;
if (convertView == null) {
i = new ImageView(Grid3.this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
l = new CheckableLayout(Grid3.this);
l.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT,
GridView.LayoutParams.WRAP_CONTENT));
l.addView(i);
} else {
l = (CheckableLayout) convertView;
i = (ImageView) l.getChildAt(0);
}
ResolveInfo info = mApps.get(position);
i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
return l;
}
public class CheckableLayout extends FrameLayout implements Checkable {
private boolean mChecked;
public CheckableLayout(Context context) {
super(context);
}
public void setChecked(boolean checked) {
mChecked = checked;
setBackgroundDrawable(checked ?
getResources().getDrawable(R.drawable.blue)
: null);
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
meiner getView () - code:
public View getView(int position, View convertView, ViewGroup parent) {
//TODO Auto-generated method stub
ViewHolder holder;
View vi = convertView;
if(convertView == null) {
vi = inflater.inflate(com.egedsoft.instaprint.R.layout.item_clickable, null);
holder = new ViewHolder();
holder.imgPhoto = (ImageView)vi.findViewById(com.egedsoft.instaprint.R.id.imageClickable);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
if (!arrayUrls.get(position).getThumbnailUrl().isEmpty()){
imageLoader.DisplayImage(arrayUrls.get(position).getThumbnailUrl(), holder.imgPhoto);
}
return vi;
}
- Wie machen Sie eine Anforderung für das abrufen von JSON-Daten? Ist die Quelle die Unterstützung der Auslagerung?
- Ich bekomme die "neben-url" von der Quelle in Fall gibt es mehr Fotos zu laden
- Lele: ich würde schätzen, wenn Sie Blick auf meine editierte Frage. Ich danke Ihnen so sehr für Ihre Hilfe.
- Ich fürchte, ich habe noch nie ein Grid-Ansicht mit Auswahl. Sollten Sie nach einer anderen Frage, für die.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich, Holen Sie mehrere Fotos in meine Tätigkeit. Sie können verwenden Sie Teile, die Sie für passen Sie Ihre Logik. Ich benutze diese zum abrufen von Facebook-Bildern aus einem Album. Also meine Bedürfnisse sind (ich nehme an) unterscheiden sich von Ihren Bedürfnissen. Aber noch einmal, die Logik verwenden, um Sie.
Hinweis: Dies wird langwierig sein. 😉
Diese werden die globalen Deklarationen für die Verwendung durch die Aktivität:
Dies ist der code-block, der holt sich den ersten Satz Bilder:
Dies ist zu erkennen, wenn der Benutzer einen Bildlauf zu Ende und Holen neue Reihe von Bildern:
Und schließlich, das ist, wie ich holt sich den nächsten Satz von Bildern:
- Und dies ist der helper-Klasse
SET
undGET
die gesammelten Daten aus den Abfragen oben:Wenn Sie wollen auch die
adapter
code, lassen Sie es mich wissen. Ich benutze Fedor ist Lazy Loading Methode in den adapter.Puh. Hoffe jeder der dies hilft. Wenn Sie Fragen haben, fühlen Sie sich frei, zu Fragen. 🙂
EDIT: Adapter code Hinzugefügt:
EDIT: Zusätzlichen Schritte aus, um die Fortschritte zu zeigen, während des Ladens:
Fügen Sie eine Statusanzeige, um Sie XML wo du das GridView direkt darunter. Spielen, um mit dem Gewicht, wenn es verursacht Probleme.
In Ihrer Java -, die erklären, die
Linearlayout linlaProgressBar
als Global und warf es in dieonCreate()
und legen Sie die Sichtbarkeit alslinlaProgressBar.setVisibility(View.GONE);
Und in der
onPreExecute()
verwenden Sie es wie diese:Und schließlich fügen Sie diese in die
onPostExecute()
Adapter
code wurde Hinzugefügt, um die post.res
Ordner: wptrafficanalyzer.in/blog/.... DiegetPhotos
ist ein ziemlich standard-Setter / Getter der Klasse Datei.getPhotosData
und dieloadMorePhotos
Klassen sind in der Aktivität. DieloadMorePhotos
wird nur aufgerufen, wenn der Benutzer einen Bildlauf zu der Unterseite der Seite, die die BetreuungsetOnScrollListener
definiert in deronCreate()
.ImageLoader
code zu??ImageLoader
. Aber wenn ich versuche den code auszuführenhttps:\\graph.facebook.com` returns me null data. Applying same querying on
Graph Api Explorer " gibt mir die richtigen Daten.Wenn u paar Sekunden, dann werfen Sie einen Blick in die hier stackoverflow.com/questions/14861003/...arrPhotos
wird Global definiert als:ArrayList<getPhotos> arrPhotos
in diegetPhotos
ist die POJO-Klasse verwendet, um zu behandeln die verschiedenen Daten zurückgegeben. Ich hielt ein paar Sachen heraus zu halten, den post so kurz wie möglich. Hoffe, das hilft.getPhotosData
ist in der Tat aufgerufen, in deronCreate()
mit diesem:new getPhotosData().execute();
Sorry für die Herstellung Sie erraten. Ich werde den Beitrag aktualisieren, ein paar andere Dinge, sobald ich mich erinnern, wo ich gespeichert habe die Quelle (es ist ziemlich alt :-))visibleItemCount
als die Anzahl der Elemente tatsächlich angezeigt werden.Können Sie, werfen Sie einen Blick auf Mit adapter-Ansichten und GridView von Android-Dokumentation.
Das wichtigste ist, dass der adapter rufen Sie die Methode
getView
Sie nur die position der Einträge zeigt auf dem Bildschirm, und Fragen für die verschiedenen Positionen, wenn der Benutzer scrollt.Der einfache Weg zu tun ist, laden Sie das gewünschte Bild auf der
getView
Methode des Adapters mit und AsyncTask.Es ist ein Beispiel
Spricht aus Erfahrung, ist es schwierig zu erreichen, smooth-scrolling (und die Allgemeine Reaktionsfähigkeit) und verbraucht den Speicher vernünftig.
Wäre es eine gute Idee, sich für bestehende Lösungen zuerst, z.B. hier anfangen:
Lazy load von Bildern in ListView
Landeten wir mit einer benutzerdefinierten proprietäre Lösung. Es ist ein hintergrund-thread, dass die Warteschlangen download-Anfragen und downloads und caches auf dem externen Speicher nur die Bilder, die sind noch sichtbar. Wenn ein neues Bild ankommt, die Ansicht wird informiert und entscheidet, Wann zu informieren und den adapter zu aktualisieren.
Sondern spart auch Bandbreite, was wichtig war in einigen Fällen.
Fand ich IceMAN ' s Antwort sehr nützlich, aber ich empfehle auch vermeiden, mit zwei AsyncTasks und Sie können diese einfach.
Müssen Sie erstellen eine Universelle Methode zum abrufen von Daten benötigen, wo Sie können eine if - /else-Bedingung (als Beispiel):
addMovies ist ein boolescher Wert, in Ihrem onScroll-Methode.
Im AsyncTask aktuelle Seite in der Abfrage-URL und voila - Sie haben Ihr code kleiner 🙂