在自定义ListView中滚动滞后

时间:2012-05-12 05:57:12

标签: android listview

我一直在使用包含1个imageView和3个textView的自定义listView。图像是从url加载的,因此减慢了我的滚动速度。感谢任何帮助..

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是包含所有数据的哈希映射数组

2 个答案:

答案 0 :(得分: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();
}

}

答案 1 :(得分:0)

Use Universal Image Downloader显示图片。

它对我很好,希望能为你工作......!