web-dev-qa-db-fra.com

Rappel de chargement d'image Picasso

Je veux utiliser Picasso pour charger trois images consécutives les unes sur les autres dans une liste. L'utilisation des méthodes fournies par Picasso rend cela facile. Cependant, parce que ces images se chargent à différents moments, cela provoque un effet de scintillement lorsque les images entrent. Par exemple, parfois l'image 2 apparaît avant l'image 1 et lorsque l'image 1 se charge, elle provoque un bégaiement artificiel. Il serait préférable de définir la visibilité de la vue de liste sur invisible jusqu'à ce que toutes les images soient disponibles pour être affichées. Cependant, je n'ai trouvé aucune méthode de rappel pour Picasso qui signalerait le chargement d'une image.

Quelqu'un connaît-il une solution à ce genre de situation en utilisant Picasso?

Merci

42
Ebay89

La méthode .into Fournit un deuxième argument qui rappelle le succès et l'échec. Vous pouvez l'utiliser pour garder une trace du moment où les trois ont été appelés et agir sur leur visibilité en même temps.

Javadoc: https://square.github.io/picasso/2.x/picasso/com/squareup/picasso/RequestCreator.html#into-Android.widget.ImageView-com.squareup.picasso.Callback-

58
Jake Wharton

Voici un exemple simple pour implémenter le rappel de chargement d'image Picasso:

Picasso.with(MainActivity.this)
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError() {
                            //do smth when there is picture loading error
                        }
                    });

Sur la dernière version de Picasso, onError reçoit une exception comme paramètre et utilise get () au lieu de with ()

Picasso.get()
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError(Exception ex) {
                            //do smth when there is picture loading error
                        }
                    });
34
dzikovskyy

Vous pouvez implémenter un rappel avec Picasso comme indiqué ci-dessous:

ImageHandler.getSharedInstance(getApplicationContext()).load(imString).skipMemoryCache().resize(width, height).into(image, new Callback() {
            @Override
            public void onSuccess() {
                layout.setVisibility(View.VISIBLE);
            }

            @Override
            public void onError() {

            }
        });
}

L'implémentation de ma classe ImageHandler est illustrée ci-dessous:

public class ImageHandler {

    private static Picasso instance;

    public static Picasso getSharedInstance(Context context)
    {
        if(instance == null)
        {
            instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
        }
        return instance;
    }
}
9
Lord Sidious

Ceci charge une URL d'image dans une vue d'image avec des rappels picasso simples

           Picasso.with(this)
            .load(Picurl)
            .into(Imageview, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {


                        }
                    }
            );

Et ceci est le chargement d'image picasso avec plus de rappels

private void loadImage() {
    Picasso.with(this)
            .load(PicURL)
            .into(mContentTarget);
  }


private Target mContentTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    Imageview.setImageBitmap(bitmap);
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
    }
};
3
MIDHUN CEASAR

Vous pouvez utiliser l'objet Target . Une fois que target1 reçoit le rappel, vous pouvez télécharger le 2e élément, puis récupérer le rappel dans target2, puis déclenchez le 3e téléchargement.

0
mbmc