2

我有一个 listView 和一个适配器,
我已经滚动到列表的中间(比如说如果我们有 100 个项目,我在第 50 个项目中)
一旦到了那里,我就会从服务器获得一些更新.. 比如说,像新的来自 facebook 的故事..
A. 我想调用 notifyDataSetChanged() 并保持位置 - 因为我使用 了 B. 我正在使用 volley 库中可爱的NetworkImageView,我想要,当调用 notifyDataSetChanged时- 图像不会得到现在重新加载,因为,(也许这就是我的问题的根源),目前,重新加载图像会导致用户出现某种闪烁(没有加载照片照片)this code

编辑:

    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);
}
}

你们有什么感想?

10倍

4

1 回答 1

0

我正在使用 volley 库中可爱的 NetworkImageView,我想要,当调用 notifyDataSetChanged 时 - 图像不会像现在这样重新加载,因为,(也许这就是我的问题的根源),此刻,重新加载图像会导致用户出现某种闪烁(未加载照片照片)

您是否为 ImageLoader 提供了内存缓存?调用时.setImageUrl,Volley 首先尝试从您在实例化 ImageLoader 时提供的缓存中获取图像,然后进入磁盘缓存(内置于 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));
于 2013-09-17T15:55:44.020 回答