Android的BaseAdapter随着LruCache一些用户界面问题(Android Base

2019-10-21 10:10发布

我想实现到与底座适配器和LruCache的帮助下所有接触图像列表视图。 但在屏幕上的所有图像(对应于该视图)长卷在设置实际的图像之前显示。

例如:每页5个项目,如果我们从第一次接触到第60位,上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);
}

如何解决这个问题呢。 谢谢

Answer 1:

当你向下滚动,你的观点得到重用对于映入眼帘的新列表中的位置。 既然你每个getView调用时开始一个新的BitmapManager任务,任务得到一字排开,等待更新图像。 当他们每完成加载其位,他们把它放到ImageView的才能,这是你所看到的。

它看起来像你试图用一个参考的ImageView避免使用位图它滚出视后,但没有工作的原因是适配器回收利用ImageViews,所以参考保持有效,即使在现实中的ImageView被用于不同的列表项现在。

有不同的方法来解决这个问题,但我想到的最简单的就是用一个列表索引,而不是本身的ImageView来构建你的BitmapManager。 然后在getView你可以保持地图的什么什么位置正在使用的意见。 当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);
}


文章来源: Android BaseAdapter With LruCache Some ui problems