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