gpt4 book ai didi

带有 LruCache 的 Android BaseAdapter 一些 ui 问题

转载 作者:行者123 更新时间:2023-11-30 02:30:08 25 4
gpt4 key购买 nike

我正在尝试在基本适配器和 LruCache 的帮助下实现包含所有联系人图像的 ListView 。但是在屏幕上的长滚动中,在设置实际图像之前会显示所有图像(对应于该 View )。

例如:每页有 5 个项目的 ListView ,如果我们从第一个联系人滚动到第 60 个,在 ListView 的第一个 View 中,1,6,11,16,21..51 的图像会在之前显示几毫秒显示第 55 张图像

主要代码是

//Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if(imageView == null){
imageView = new ImageView(getActivity());
}
int id = contactId[position];
final String imageKey = String.valueOf(contactId);
final Bitmap bitmap = cache.get(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Resources res = context.getResources();
BitmapManager bm = new BitmapManager(imageView, res, cache);
bm.setContext(getActivity());
bm.execute(id);
}
return imageView;
}

BitmapManager 后执行代码

@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
try{
if(isCancelled()){
bitmap = null;
}
if(imageViewReference != null && bitmap != null){
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
cache.put(String.valueOf(res), bitmap);
if(imageView != null){
imageView.setImageBitmap(bitmap);
}

}
}catch(Exception e){

}
super.onPostExecute(bitmap);
}

如何解决这个问题。谢谢

最佳答案

当您向下滚动时,您的 View 将重新用于进入 View 的新列表位置。由于每次调用 getView 时您都会启动一个新的 BitmapManager 任务,因此这些任务会排好队,等待更新图像。当他们各自完成加载位图时,他们按顺序将其放入 ImageView,这就是您所看到的。

看起来你试图使用对 ImageView 的引用来避免在它滚出 View 后使用位图,但不起作用的原因是适配器正在回收你的 ImageView,因此引用保持有效,即使实际上 ImageView 现在正用于不同的列表项。

有多种方法可以解决这个问题,但我想到的最简单的方法是使用列表索引构建 BitmapManager,而不是 ImageView 本身。然后在 getView 中,您可以保留在哪些位置使用哪些 View 的 map 。当 BitmapManager 完成时,检查您刚刚加载到缓存中的位置是否有当前 ImageView。如果没有,则什么也不做。

这里有一些代码可以说明我在说什么。我没有尝试过,如果有错误,请见谅。

//Adapter
private SparseArray<ImageView> ivMap = new SparseArray<ImageView>();
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if(imageView == null){
imageView = new ImageView(getActivity());
} else {
// If recycled, remove the ImageView's previous position from map
int oldPosition = ivMap.indexOfValue(imageView);
if (oldPosition >= 0) {
ivMap.remove(oldPosition);
}
}
// Keep track of which view is representing this position
ivMap.put(position, imageView);

int id = contactId[position];
final String imageKey = String.valueOf(contactId);
final Bitmap bitmap = cache.get(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Resources res = context.getResources();
BitmapManager bm = new BitmapManager(ivMap, position, res, cache);
bm.setContext(getActivity());
bm.execute(id);
}
return imageView;
}

//BitmapManager
@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
try{
if(isCancelled()){
bitmap = null;
}
if(bitmap != null){
cache.put(String.valueOf(res), bitmap);
ImageView imageView = ivMap.get(position);
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}catch(Exception e){

}
super.onPostExecute(bitmap);
}

关于带有 LruCache 的 Android BaseAdapter 一些 ui 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27425696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com