Сохраняйте позицию прокрутки адаптера при вызове notifyDataSetChanged и не перезагружайте NetworkImageView

У меня есть listView и адаптер,
я прокрутил список до середины (скажем, если у нас есть 100 элементов, я нахожусь в элементе № 50)
Оказавшись там, я получаю пару обновлений с сервера. .. скажем, как новые истории из facebook..
A. Я хочу вызвать notifyDataSetChanged() и сохранить позицию — для этого я использовал this code
B. Я использую прекрасную NetworkImageView из библиотеки volley, я хочу, чтобы при notifyDataSetChanged вызывается - изображение не будет перезагружено в том виде, в котором оно есть сейчас, потому что (и, возможно, это является источником моей проблемы), в данный момент перезагрузка изображения вызывает какое-то мерцание для пользователя (нет фото- фото загружено)

ИЗМЕНИТЬ:

    mQueue = Volley.newRequestQueue(getApplicationContext());// thread pool(4)
    mngr.setRequestQueue(mQueue);

    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    mImageLoader = new ImageLoader(mQueue, new ImageCache() {

        private final LruBitmapCache mCache = new LruBitmapCache(maxMemory);

        public void putBitmap(String url, Bitmap bitmap) {

            mCache.put(url, bitmap);
        }

        public Bitmap getBitmap(String url) {

            return mCache.get(url);

        }
    });

Мое решение:

//      final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    mImageLoader = new ImageLoader(mQueue, new ImageCache() {

        private final BitmapLruCache mCache = new BitmapLruCache();

        public void putBitmap(String url, Bitmap bitmap) {

            mCache.put(url, bitmap);
        }

        public Bitmap getBitmap(String url) {

            return mCache.get(url);

        }
    });

Я использовал следующую реализацию кеша bimtap lru

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
public static int ONE_KILOBYTE = 1024;

public BitmapLruCache() {
    this(getDefaultLruCacheSize());
}

public BitmapLruCache(int maxSize) {
    super(maxSize);
}

public static int getDefaultLruCacheSize() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / ONE_KILOBYTE);
    final int cacheSize = maxMemory / 8;

    return cacheSize;
}

@Override
protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes() * value.getHeight() / ONE_KILOBYTE;
}

@Override
public Bitmap getBitmap(String url) {
    return get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
    put(url, bitmap);
}
}

Ребята, что вы думаете?

10x


person Elad Gelman    schedule 17.09.2013    source источник
comment
пожалуйста, покажите, как вы инициализировали свою очередь залпа, загрузчик изображений и код вашего адаптера.   -  person Pork 'n' Bunny    schedule 19.09.2013
comment
@Pork Я добавил детали инициализации   -  person Elad Gelman    schedule 22.09.2013


Ответы (1)


Я использую прекрасный NetworkImageView из библиотеки volley, я хочу, чтобы при вызове notifyDataSetChanged изображение не перезагружалось, как сейчас, потому что (и, возможно, это источник моей проблемы), на данный момент , перезагрузка изображения вызывает какое-то мерцание у пользователя (фото не загружается)

Вы снабдили свой ImageLoader кэшем в памяти? При вызове .setImageUrl Volley сначала пытается получить изображение из кеша, который вы указали при создании экземпляра ImageLoader, затем переходит к Disk-Cache (встроенному в Volley), а затем переходит в сеть. Если вы правильно использовали кэш-память, .setImageUrl должно вернуться мгновенно, без мерцания. Я предполагаю, что вы использовали дисковый кеш (который, к сожалению, рекомендуется в некоторых учебниках).

Пример кэша памяти можно найти, например, здесь: https://github.com/ogrebgr/android_volley_examples/blob/master/src/com/github/volley_examples/toolbox/BitmapLruCache.java, затем создайте экземпляр ImageLoader следующим образом:

int cacheSize = 1024 * 1024 * 10; // 10MB Cache
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(cacheSize));
person Nils Borrmann    schedule 17.09.2013
comment
Привет @nborrmann, я отлаживаю его, я уверен, что реализовал его с кешем l1 (mem) l2 (disk) - person Elad Gelman; 17.09.2013
comment
@Nils Я сталкиваюсь с похожей проблемой, подобной этой stackoverflow.com/questions/30850315/ - person Roon13; 17.06.2015