Android ListView中的图像(来自Web)在出现时始终重新加载

时间:2012-03-13 23:33:19

标签: android android-listview android-arrayadapter android-imageview

我有一个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;
        }
    }       

2 个答案:

答案 0 :(得分:2)

Brett的答案只是解决方案的一半,是的,图像下载应该是异步完成的,但是每次滚动列表视图时,由于listview的优化,你最终会反复下载相同的图像。

它重复使用视图,因此即使您下载了图像并进行了设置,如果向下滚动多个项目,该视图将被重复使用,并且当您向上滚动时必须再次下载图像。

为了防止这种情况,您还需要图片缓存。请参阅Android开发人员博客上的this post

很快,博客上的代码提供了异步图像下载和图像缓存。源代码可以从here

获得

注意:您需要对源代码进行轻微更改

更改第58行
private Mode mode = Mode.NO_ASYNC_TASK;

private Mode mode = Mode.CORRECT;

答案 1 :(得分:1)

如果我理解你的困境,你需要在后台加载drawable,而不是同步,并插入一个空白/本地占位符图像。下载完正确的图像后,您可以用它替换占位符。