我有一个ListView
,而不是包含从网站链接(例如http://www...image.jpg
)创建的图片列表,其中包含以下内容:
Drawable d = LoadImageFromUrlWeb(TopTen_LinkImg);
imageTopTenView.setImageDrawable(d);
我创建了一个自定义ArrayAdapter
(简单并优化了“持有者”相同的结果)。
问题是显示在显示器上的每个图像都是从网上传输的,浏览页面列表是不可能的(太慢)。
有一个代码可以分配给ImageView
永久性图片。
代码是:
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.row_top_ten, null);
ImageView imageTopTenView = (ImageView)rowView.findViewById(R.id.imageTopTen);
String TopTen = (String)ArrayDatiTopTen.get(position);
String[] ArrayTopTen=TopTen.split(",");
String TopTen_LinkImg=(String)ArrayTopTen[0];
Drawable d = LoadImageFromUrlWeb(TopTen_LinkImg);
imageTopTenView.setImageDrawable(d);
return rowView;
}
也许解决方案是使用编程代码填充listView:
ListView listView=(ListView) findViewById(R.id.listView);
...
listView.addView(...)
...
我已经解决了创建一个Drawable数组并在使用之前用ArrayAdapter
// Define:
Drawable imageCache[]=new Drawable[100];
然后:
//loop to popolate array
imageCache[ct]=LoadImageFromUrlWeb(Link);
在ArrayList
我使用:
...
imageTopTenView.setImageDrawable(imageCache[position]);
return rowView;
...
从url string到drawable:
private Drawable LoadImageFromUrlWeb(String url)
{
try
{
url=url.replaceAll(" ", "%20");
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
}
catch (Exception e)
{
Log.w("LoadImageFromUrlWeb",e.toString());
return null;
}
}
答案 0 :(得分:2)
Brett的答案只是解决方案的一半,是的,图像下载应该是异步完成的,但是每次滚动列表视图时,由于listview的优化,你最终会反复下载相同的图像。
它重复使用视图,因此即使您下载了图像并进行了设置,如果向下滚动多个项目,该视图将被重复使用,并且当您向上滚动时必须再次下载图像。
为了防止这种情况,您还需要图片缓存。请参阅Android开发人员博客上的this post。
很快,博客上的代码提供了异步图像下载和图像缓存。源代码可以从here
获得(注意:您需要对源代码进行轻微更改)
从
更改第58行private Mode mode = Mode.NO_ASYNC_TASK;
到
private Mode mode = Mode.CORRECT;
答案 1 :(得分:1)
如果我理解你的困境,你需要在后台加载drawable,而不是同步,并插入一个空白/本地占位符图像。下载完正确的图像后,您可以用它替换占位符。