Android 防止ListView在重用视图时反复下载图像

Android 防止ListView在重用视图时反复下载图像,android,image,listview,android-listview,Android,Image,Listview,Android Listview,我试过网络上的其他例子,但似乎无法解决这个问题。我有一个包含一个ImageView和一个TextView的ListView。图像以异步方式加载到ImageView中。但由于android似乎重用了这些视图,因此经常调用getView(),并一次又一次地下载相同的图像。所以我试着使用ViewHolder。代码如下: public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holde

我试过网络上的其他例子,但似乎无法解决这个问题。我有一个包含一个ImageView和一个TextView的ListView。图像以异步方式加载到ImageView中。但由于android似乎重用了这些视图,因此经常调用getView(),并一次又一次地下载相同的图像。所以我试着使用ViewHolder。代码如下:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) this.mContext
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_view_item, null);

        holder = new ViewHolder();
        holder.imageDesc = (TextView) convertView.findViewById(R.id.desc);
        holder.image = (ImageView) convertView.findViewById(R.id.image);

        convertView.setTag(holder);

            holder.imageDesc.setTypeface(null, Typeface.BOLD);
        holder.imageDesc.setText(dataList.get(position).getImageDesc());

            //Loads image asynchronously into the imageView
            ImageLoader.loadImage(holder.image, ((ListViewItem)getItem(position)).getImageLink());

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

static class ViewHolder {
    TextView imageDesc;
    ImageView image;

}
这似乎只下载了一次代码。但是,如果我滚动ListView,则项目会随机放置并显示在ListView中。 在没有这些问题的情况下,在ListView中异步显示图像的正确方法是什么??我遗漏了什么吗?

使用以下方法:

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) this.mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_view_item, null);

            holder = new ViewHolder();
            holder.imageDesc = (TextView) convertView.findViewById(R.id.desc);
            holder.image = (ImageView) convertView.findViewById(R.id.image);

            convertView.setTag(holder);
                } else {
            holder = (ViewHolder) convertView.getTag();
        }
     holder.imageDesc.setTypeface(null, Typeface.BOLD);
            holder.imageDesc.setText(dataList.get(position).getImageDesc());

                //Loads image asynchronously into the imageView
                ImageLoader.loadImage(holder.image, ((ListViewItem)getItem(position)).getImageLink());
        return convertView;
    }

您是否使用通用图像加载器??它只会下载一次图像,你可以通过磁盘缓存图像或内存缓存,也可以考虑将位图存储在一个数组中,并将它从ITI使用的Picaso中显示出来。我想知道这些库正在实现什么。如果在arraylist中存储位图,我的应用程序不会占用太多内存吗@IllegalArgument@MilanMaharjan他们只是使用了聪明的缓存策略。你最好阅读一些源代码。是的,它存储在ARARYLIST中,占用了大量的内存。像PICASO这样的库,在UIL的情况下,使用唯一的标识符来识别位图,它是位图的大小所附加的URL。