我需要在 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/