1

我有一个自定义listview,其中包含来自服务器的图像和文本。如果服务器返回 500 多组数据,我可以将所有数据呈现给我listview,但加载需要很长时间

相反,当列表向下滚动时,我应该呈现数据。为此,我返回了一些代码来加载图像,但我仍然对这段代码不满意。我getView()通过调用 manager.fetchBitMapThread(data.getImgUrl(),iv) (ImageLoaderThread)从该方法加载图像。因为运行时会创建这么多线程。有人可以建议加载自定义数据的好主意吗listview

我见过OnScrollListener,但我不明白如何为自定义实现这一点listview

manager.fetchBitMapThread(data.getImgUrl(),iv);


public class Manager {

ImageView imageView;
final int stub_id=R.drawable.stub;
private final Map<String, Bitmap> bitMap;

public Manager() {
    bitMap = new HashMap<String, Bitmap>();
}

public void fetchBitMapThread(final String urlString, final ImageView imageView) {
    this.imageView = imageView;
    if (bitMap.containsKey(urlString)) {
        imageView.setImageBitmap(bitMap.get(urlString));
    }
    imageView.setImageResource(stub_id);
    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            if(!message.equals(null))
            imageView.setImageBitmap((Bitmap) message.obj);
            else
            imageView.setImageResource(stub_id);
        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            // set imageView to a "pending" image
            Bitmap bitM = fetchBitmap(urlString);
            Message message = handler.obtainMessage(1, bitM);
            handler.sendMessage(message);
        }
    };
    thread.start();
}


public Bitmap fetchBitmap(String urlString) {
    if (bitMap.containsKey(urlString)) {
        return bitMap.get(urlString);
    }

    Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
    try {
        InputStream is = fetch(urlString);


        Bitmap drawable = BitmapFactory.decodeStream(is);


        if (drawable != null) {
            bitMap.put(urlString, drawable);
            //Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", " + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", " + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
        } else {
            //wrong.setImageResource(stub_id);
            Log.w(this.getClass().getSimpleName(), "could not get thumbnail");

        }

        return drawable;
    } catch (MalformedURLException e) {
        Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
        //imageView.setImageResource(stub_id);
        return null;
    } catch (IOException e) {

        Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
    //  imageView.setImageResource(stub_id);
        return null;
    }
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(urlString);
    HttpResponse response = httpClient.execute(request);
    return response.getEntity().getContent();
}

}

4

3 回答 3

2

follow this link to Load images from server in Custom List View. http://androidexample.com/Download_Images_From_Web_And_Lazy_Load_In_ListView_-_Android_Example/index.php?view=article_discription&aid=112&aaid=134

Download this and try to implement it in your application.

于 2014-02-15T07:21:21.897 回答
1

按照这个链接

http://android-er.blogspot.in/2010/07/load-listview-in-background-asynctask.html

使用异步任务从服务器加载图像并将其显示在 ListView 中的完整示例

于 2012-05-02T05:53:50.347 回答
1

OnScrollListener 提供了四个参数,如下所示:

                   public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount)

顾名思义,第一个是您在屏幕上可见的第一个项目,第二个是您可见的项目总数,最后一个告诉您项目列表的总数,在您的情况下是 500+。因此,发送请求以下载用户可见的那些 itema/rows 的图像。通过 ding 这首先将创建更少的线程,第二个优点是图像将下载得更快。使用占位符或进度条进行图像视图。

为位图图像准备一张地图,并以 url 值作为键。在获取视图方法中,检查特定图像视图位置的位图是否下载或不使用哈希图,并根据该设置进度条可见性。

对于上述操作,您不能简单地创建一个线程(在匿名内部类中),通过创建一个类扩展线程并实现一个侦听器来有效地做到这一点,该侦听器通知 ui 线程和背景是否下载图像。这将类似于创建线程异步管道。

我希望上述方法可以帮助您加载 500 多行而无需花费时间,否则以异步方式下载所有图像会导致位图内存不足异常,并且也需要花费大量时间。

于 2012-05-02T08:04:37.643 回答