android - 在 ListView 中显示照片,如何让适配器在用户看到列表之前预加载?

标签 android

我需要在 ListView 中显示一些照片,这些照片是从 ListView 中的 url 中提取的。不幸的是,下载时间存在一些差异。实际的下载是在 ListView 的适配器中完成的。这些下载是 runOnUIThread。 (是的,我知道这是可怕的设计)。所以发生的事情是在下载完成时显示图像,这导致图像显示缓慢且有点困惑,尽管我正在缓存它们。

我打算重写逻辑,但与此同时,我想知道让适配器在实际需要显示照片之前采取行动。换句话说,我想在实际打算向用户显示列表之前运行适配器。我怎样才能做到这一点?我希望在用户看到列表之前进行此下载。

换句话说,我需要适配器中的以下方法在列表对用户可见之前运行:

 public View getView(final int position, View convertView, ViewGroup parent) 
 {
     // Inside here I am requesting the photo bitmap from url and setting to ImageView.
 }

最佳答案

选项 1:在适配器的构造函数中预加载

在适配器的构造函数中,遍历集合列表并将图像发送到图像下载器以开始下载。您可以只开始前 5-10 个,或者最多 50 个左右。如果您的用户可能使用手机,请注意他们的带宽速度/成本并将您的预加载限制在 20 个左右。

/** Constructor of MyAdapter extends ArrayAdapter<Item> */
public MyAdapter(Context context, List<Item> items) {
  super(context, 0, items);

  int limit = Math.min(10, items.size());
  for (int i = 0; i < limit; i++) {
    // don't fetch by position if `items` doesn't support random access
    AsyncImageLoader.prefetchImage(items.get(i).getImageUrl());
  }
}

-和/或-

选项 2:加载一行时,预加载接下来的几行

在适配器的 getView 中,预加载下几个项目的图像;例如

public View getView(int position, View convertView, ViewGroup parent) {
  int limit = Math.min(position + 4, getCount());
  for (int i = position; i < limit; i++) {
    AsyncImageLoader.prefetchImage(getItem(i).getImageUrl());
  }
}

关于android - 在 ListView 中显示照片,如何让适配器在用户看到列表之前预加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11696584/

相关文章:

Android查询,可点击列表

android - 在我自己的应用程序中接收 Whatsapp "Send chat via" Intent

android - 开始YouTube Activity 以取得结果

java - 如何提示用户输入有效的手机号码?

android - 从 ListView 中单击的项目获取字符串值

java - 重新安装 Eclipse 后无法再构建项目

安卓-OKHttp : how to enable gzip for POST

java - 适用于 Android 的 Spring : REST server

android - 为什么我的 scrollHorizo​​ntally 不起作用?

android - 是否可以在层列表中定义 XferMode?