2081 Stimmen

Wie man Bilder in ListView in Android verzögert lädt

Ich verwende eine ListView um einige Bilder und die mit diesen Bildern verbundenen Beschriftungen anzuzeigen. Ich beziehe die Bilder aus dem Internet. Gibt es eine Möglichkeit, Bilder langsam zu laden, so dass die Benutzeroberfläche nicht blockiert wird, während der Text angezeigt wird, und die Bilder so angezeigt werden, wie sie heruntergeladen werden?

Die Gesamtzahl der Bilder ist nicht festgelegt.

13 Stimmen

Sie können verwenden GreenDroids AsyncImageView . Einfach anrufen setUrl .

8 Stimmen

Ich habe es benutzt. Es ist eine wunderbare Umsetzung. Schlechte Nachricht, dass AsyncImageView ist ein Teil eines großen GreenDroid Projekt, das Ihre Anwendung größer machen, auch in dem Fall, alles, was Sie brauchen, ist AsyncImageView. Auch scheint, GreenDroid Projekt ist nicht seit 2011 aktualisiert.

6 Stimmen

Sie können diese Bibliothek auch einmal ausprobieren: Android-http-image-manager die meiner Meinung nach die beste Lösung für asynchrones Laden von Bildern ist.

8voto

user2779311 Punkte 1532

Geben Sie Aquarien einen Versuch. Es verfügt über erstaunlich einfache Methoden zum asynchronen Laden und Zwischenspeichern von Bildern.

8voto

Pratik Dasa Punkte 7361

Ich kann eine andere Methode empfehlen, die sehr gut funktioniert: Android Query.

Das können Sie herunterladen JAR Datei von aquí

AQuery androidAQuery = new AQuery(this);

Ein Beispiel:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);

Sie ist sehr schnell und genau und bietet viele weitere Funktionen wie Animation beim Laden, Abrufen einer Bitmap (falls erforderlich) usw.

7voto

DiegoAlt Punkte 89

URLImageViewHelper ist eine erstaunliche Bibliothek, die Ihnen dabei hilft, dies zu tun.

5voto

Chirag Ghori Punkte 4125

Sie können die Aquarien Android Bibliothek für Lazy Loading Image und Listview... Der folgende Code kann Ihnen helfen..... Bibliothek von hier herunterladen .

AQuery aq = new AQuery(mContext);
aq.id(R.id.image1).image("http://data.whicdn.com/images/63995806/original.jpg");

5voto

j2emanue Punkte 56131

Ich hatte dieses Problem und implementierte lruCache. Ich glaube, Sie benötigen API 12 und höher oder verwenden Sie die compatiblity v4-Bibliothek. lurCache ist schnell Speicher, aber es hat auch ein Budget, so dass, wenn Sie darüber besorgt sind, können Sie einen Diskcache verwenden... Es ist alles beschrieben in Bitmaps zwischenspeichern .

Ich werde nun meine Implementierung zur Verfügung stellen, die eine Einzelperson Ich rufe von überall aus an:

//Where the first is a string and the other is a imageview to load.

DownloadImageTask.getInstance().loadBitmap(avatarURL, iv_avatar);

Hier ist der ideale Code zum Zwischenspeichern und anschließenden Aufrufen des oben genannten in getView eines Adapters beim Abrufen des Webbildes:

public class DownloadImageTask {

    private LruCache<String, Bitmap> mMemoryCache;

    /* Create a singleton class to call this from multiple classes */

    private static DownloadImageTask instance = null;

    public static DownloadImageTask getInstance() {
        if (instance == null) {
            instance = new DownloadImageTask();
        }
        return instance;
    }

    //Lock the constructor from public instances
    private DownloadImageTask() {

        // Get max available VM memory, exceeding this amount will throw an
        // OutOfMemory exception. Stored in kilobytes as LruCache takes an
        // int in its constructor.
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

        // Use 1/8th of the available memory for this memory cache.
        final int cacheSize = maxMemory / 8;

        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in kilobytes rather than
                // number of items.
                return bitmap.getByteCount() / 1024;
            }
        };
    }

    public void loadBitmap(String avatarURL, ImageView imageView) {
        final String imageKey = String.valueOf(avatarURL);

        final Bitmap bitmap = getBitmapFromMemCache(imageKey);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            imageView.setImageResource(R.drawable.ic_launcher);

            new DownloadImageTaskViaWeb(imageView).execute(avatarURL);
        }
    }

    private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

    private Bitmap getBitmapFromMemCache(String key) {
        return mMemoryCache.get(key);
    }

    /* A background process that opens a http stream and decodes a web image. */

    class DownloadImageTaskViaWeb extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTaskViaWeb(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {

            String urldisplay = urls[0];
            Bitmap mIcon = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon = BitmapFactory.decodeStream(in);

            } 
            catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }

            addBitmapToMemoryCache(String.valueOf(urldisplay), mIcon);

            return mIcon;
        }

        /* After decoding we update the view on the main UI. */
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X