我有一个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倍
答案 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));