LazyLoad изображения в GalleyView - Android - PullRequest
0 голосов
/ 24 сентября 2011

Я искал и не нашел ничего полезного в проблеме, с которой я столкнулся.

Я выбираю изображения из удаленного местоположения и сохраняю их в локальном кэше по мере необходимости, когда изображение загружено, я использую ленивую загрузку, чтобы обновить ImageView, который его запрашивал.Все работает нормально, но когда запрос приходит от адаптера Gallery и после завершения загрузки он, по-видимому, обновляет не только изображение, которое его запрашивало, а скорее весь GalleryView.Это действительно раздражает, как будто пользователь прокручивает галерею, он возвращается к последней известной позиции, когда одно из запрошенных изображений готово к показу.

То же самое происходит, если я просто перетаскиваю галерею в одну сторону, и когда новое изображение, которое только что появилось, готово, оно возвращается к последней известной позиции, и мне приходится перетаскивать все заново и так далееи так далее ...

Так кто-нибудь знает какой-нибудь обходной путь для обновления только одного imageView в галерее, не влияя на пользовательскую прокрутку?

1 Ответ

0 голосов
/ 24 сентября 2011

У меня есть пример для вас (который я сам написал некоторое время назад и здесь абстрагировал):

public class MyAdapter ... {

    // you don't need a weak reference necessarily, in my case it was a more
    // common solution so I had to do that
    private List<WeakReference<ImageView>> mShownImageViews =
        new LinkedList<WeakReference<ImageView>>();

    public View getView(...) {
        if (view == null) {
            // create your view
            mShownImageViews.add(new WeakReference(theImageViewToUpdate));
        }

        // set your data

        // If you set null the image view will never be updated
        // you have to set the image here then
        imageView.setTag(imageAvailable ? null : "someUniqueIdForYourImage");
    }

    public void imageLoaded(String someUniqueIdForYourImage, Bitmap theImage) {
        for (WeakReference<ImageView> r : mShownImageViews) {
            ImageView iv = r.get();

            if (iv != null && iv.getTag() != null
                    && iv.getTag().equals(someUniqueIdForYourImage)) {
                iv.setImageBitmap(theImage);
                iv.setTag(null);
        }
    }
}
...