2012-05-12 70 views
0

我一直在使用含1个ImageView的3 textViews.The图像定制的ListView从网址加载,由于这会降低我的scrolling.Any帮助表示赞赏..滚动滞后于定制的ListView

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    if (convertView == null) { 

     LayoutInflater inflater = (LayoutInflater) LayoutInflater 
       .from(context); 
     convertView = inflater.inflate(R.layout.customvenue, parent, false); 

    } 

    Bitmap bitmap = null; 
    try { 
    bitmap = BitmapFactory.decodeStream((InputStream) new URL(
    VenueArray.get(position).get("VenueImage")) 
    .getContent()); 

    } catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    iconImage.setImageBitmap(bitmap); 

    return convertView; 
} 

这里VenueArray是哈希表数组包含所有数据

+0

如何从服务器下载图像? –

+0

是从服务器 –

+0

它是你使用AsykTask从服务器下载图像? –

回答

0

添加这个类,它会帮助你,就像一个魅力对我来说

public class ImageLoader { 

MemoryCache memoryCache = new MemoryCache(); 
FileCache fileCache; 
private Map<ImageView, String> imageViews = Collections 
     .synchronizedMap(new WeakHashMap<ImageView, String>()); 
private ProgressBar indicator; 

public ImageLoader(Context context) { 

    photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1); 
    fileCache = new FileCache(context); 
} 

public void DisplayImage(String url, Context activity, ImageView imageView, 
     ProgressBar pbar) { 

    imageViews.put(imageView, url); 
    Bitmap bitmap = memoryCache.get(url); 

    if (bitmap != null) { 
     this.indicator = pbar; 
     indicator.setVisibility(View.INVISIBLE); 
    // imageView.setImageBitmap(getRoundedCornerBitmap(bitmap,13)); 
     imageView.setImageBitmap(bitmap); 
    } else { 
     this.indicator = pbar; 
     indicator.setVisibility(View.INVISIBLE); 
     queuePhoto(url, activity, imageView); 
     imageView.setImageBitmap(null); 
    } 
} 

private void queuePhoto(String url, Context activity, ImageView imageView) { 
    // This ImageView may be used for other images before. So there may be 
    // some old tasks in the queue. We need to discard them. 
    photosQueue.Clean(imageView); 
    PhotoToLoad p = new PhotoToLoad(url, imageView); 
    synchronized (photosQueue.photosToLoad) { 
     photosQueue.photosToLoad.push(p); 
     photosQueue.photosToLoad.notifyAll(); 
    } 

    // start thread if it's not started yet 
    if (photoLoaderThread.getState() == Thread.State.NEW) 
     photoLoaderThread.start(); 
} 

private Bitmap getBitmap(String url) { 
    File f = fileCache.getFile(url); 

    // from SD cache 
    Bitmap b = decodeFile(f); 
    if (b != null) 
     return b; 

    // from web 
    try { 
     Bitmap bitmap = null; 
     URL imageUrl = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection) imageUrl 
       .openConnection(); 
     conn.setConnectTimeout(30000); 
     conn.setReadTimeout(30000); 
     InputStream is = conn.getInputStream(); 
     OutputStream os = new FileOutputStream(f); 
     Utils.CopyStream(is, os); 
     os.close(); 
     bitmap = decodeFile(f); 
     return bitmap; 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
} 

// decodes image and scales it to reduce memory consumption 
private Bitmap decodeFile(File f) { 
    try { 
     // decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     // Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE = 70; 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE 
        || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     // decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
    } 
    return null; 
} 

// Task for the queue 
private class PhotoToLoad { 
    public String url; 
    public ImageView imageView; 

    public PhotoToLoad(String u, ImageView i) { 
     url = u; 
     imageView = i; 
    } 
} 

PhotosQueue photosQueue = new PhotosQueue(); 

public void stopThread() { 
    photoLoaderThread.interrupt(); 
} 

// stores list of photos to download 
class PhotosQueue { 
    private Stack<PhotoToLoad> photosToLoad = new Stack<PhotoToLoad>(); 

    // removes all instances of this ImageView 
    public void Clean(ImageView image) { 
     for (int j = 0; j < photosToLoad.size();) { 
      if (photosToLoad.get(j).imageView == image) 
       photosToLoad.remove(j); 
      else 
       ++j; 
     } 
    } 
} 

class PhotosLoader extends Thread { 
    public void run() { 
     try { 
      while (true) { 
       // thread waits until there are any images to load in the 
       // queue 
       if (photosQueue.photosToLoad.size() == 0) 
        synchronized (photosQueue.photosToLoad) { 
         photosQueue.photosToLoad.wait(); 
        } 
       if (photosQueue.photosToLoad.size() != 0) { 
        PhotoToLoad photoToLoad; 
        synchronized (photosQueue.photosToLoad) { 
         photoToLoad = photosQueue.photosToLoad.pop(); 
        } 
        Bitmap bmp = getBitmap(photoToLoad.url); 
        memoryCache.put(photoToLoad.url, bmp); 
        String tag = imageViews.get(photoToLoad.imageView); 
        if (tag != null && tag.equals(photoToLoad.url)) { 

         //System.out.println("indicator ::" + indicator); 

         BitmapDisplayer bd = new BitmapDisplayer(bmp, 
           photoToLoad.imageView, indicator); 
         Activity a = (Activity) photoToLoad.imageView 
           .getContext(); 
         a.runOnUiThread(bd); 
        } 
       } 
       if (Thread.interrupted()) 
        break; 
      } 
     } catch (InterruptedException e) { 
      // allow thread to exit 
     } 
    } 
} 

PhotosLoader photoLoaderThread = new PhotosLoader(); 

// Used to display bitmap in the UI thread 
class BitmapDisplayer implements Runnable { 
    Bitmap bitmap; 
    ImageView imageView; 

    // private ProgressBar indicator1; 

    public BitmapDisplayer(Bitmap b, ImageView i, ProgressBar indicator) { 
     this.bitmap = b; 
     this.imageView = i; 
     // this.indicator1 = indicator; 
    } 

    public void run() { 
     if (bitmap != null) { 

      imageView.setImageBitmap(bitmap); 

    } 
} 

public void clearCache() { 
    memoryCache.clear(); 
    fileCache.clear(); 
} 

}

+0

您应该考虑使用新的lrucache:http://developer.android.com/reference/android/util/LruCache.html而不是weakhashmap – Warpzit