调用notifyDataSetChanged时保持适配器滚动位置,不要重新加载NetworkImageView

时间:2013-09-17 13:53:13

标签: android android-arrayadapter android-volley networkimageview

我有一个listView和一个适配器,
我已经滚动到列表的中间(例如,如果我们在项目#50中有100个项目) 在那里,我从服务器获得了一些更新...比如,来自facebook的新故事..
答:我想调用notifyDataSetChanged()并保持位置 - 因为我使用了this code
B.我正在使用排球库中可爱的NetworkImageView,我想,当调用 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);
}
}

你们有什么想法?

10倍

1 个答案:

答案 0 :(得分:0)

  

我正在使用排球库中的可爱的NetworkImageView,我想,当调用notifyDataSetChanged时 - 图像将不会像现在一样重新加载,因为,(也许这是我的问题的根源),此刻,重新加载图像会对用户造成某种闪烁(没有加载照片的照片)

您是否为ImageLoader提供了内存缓存?当调用.setImageUrl时,Volley首先尝试从实例化ImageLoader时提供的Cache中获取Image,然后转到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));