user3566569
user3566569

Reputation: 109

Android Picasso set previously loaded image as a placeholder

I'm loading smaller quality version of image with Picasso, and if user clicks on that image in a list, then new Activity opens where I'm showing full quality version of image also with Picasso.

Problem is that full quality version of image is large so it takes some time to load it.

I would like that during that period previously loaded smaller quality version of image is shown. Picasso would show it instantly because it was already loaded on previous Activity.

I tried to implement it by call Picasso method twice like this:

Picasso.get().load(url_small_quality).into(imageView)
Picasso.get().load(url_full_quality).into(imageView)

but I think it skips load(url_small_quality) because imageView is empty for some time until url_full_quality is loaded.

I tried to run only load(url_small_quality) and then image is loaded instantly as it should, because it was previously loaded and stored.

Is there a way to somehow set previously loaded smaller quality image as a placeholder until full quality image is loaded?

Upvotes: 1

Views: 792

Answers (3)

danyapd
danyapd

Reputation: 2506

As Astha Garg said in comments this can't be done:

Picasso.get().load(url_small_quality).into(imageView)
Picasso.get().load(url_full_quality).into(imageView)

Simply create one more imageview and place it above previous one with thumb and load your high resolution there.

Java:

Picasso.get().load(url_small_quality).into(IVThumb, new Callback() {
    @Override
    public void onSuccess() {
        Picasso.get().load(url_full_quality).into(IVFull, new Callback() {
            @Override
            public void onSuccess() {

            }
            @Override
            public void onError(Exception e) {

            }
        });
    }
    @Override
    public void onError(Exception e) {

    }
});

xml:

inside LinearLayout create:

<ImageView
    android:id="@+id/IVThumb"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<ImageView
    android:id="@+id/IVFull"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Upvotes: 0

Astha Garg
Astha Garg

Reputation: 1122

  1. You can use a drawable as placeholder but that would be a default image

        Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
    
  2. You can load your high quality image after successfully loading your low quality image like below(Since there's no direct way to achieve this or other can be to use disk caching but that would require more efforts) :-

        Picasso.with(context)
        .load(thumb) // small quality url goes here
        .into(imageView, new Callback() {
             @Override
             public void onSuccess() {
                 Picasso.with(context)
                         .load(url) // full quality url goes here
                         .placeholder(imageView.getDrawable())
                         .into(imageView);
             }
             @Override
             public void onError() {
    
             }
         });
    

Upvotes: 1

AndroidDev
AndroidDev

Reputation: 21

Most probably picasso is cancelling your previous request , you can try this

 Picasso.get().load(url_small_quality).into(imageView,object:Callback{
            override fun onSuccess() {
                Picasso.get().load(url_full_quality).into(imageView)
            }

            override fun onError(e: Exception?) {
              
            }

        })

Upvotes: 1

Related Questions