我一直在寻找在Android中加载ListView图片的最佳方法。
这些图片来自服务器,所以加载可能需要一些时间。据我了解,只有两种实现方式:
1-在主线程上加载图片-这样可以在视图显示和滚动时立即显示正确的图片,但会导致滚动性能差,并可能导致应用程序挂起和崩溃。
2-在AsyncTask中加载图片。这意味着当列表显示或滚动时,图片将为空,但最终会显示出来。由于列表进行的缓存,您还可以为项目获取错误的图片。但这具有良好的性能和滚动效果,并且不会挂起/崩溃。
似乎这两种解决方案都不正确。难道没有解决方法?我已看到其他类似的帖子,但答案似乎总是1或2,但这都不是一个好的解决方案...
我的列表适配器代码如下。 HttpGetImageAction.fetchImage() 方法根据我设置的标志执行异步任务或在主线程上获取图像。一旦加载完毕,我还在本地和磁盘上缓存这些图像,因此问题主要发生在第一次(但缓存仅适用于100张图片,而列表中有数千张)
public class ImageListAdapter extends ArrayAdapter<WebMediumConfig> {
Activity activity;
public ImageListAdapter(Activity activity, int resourceId, List<WebMediumConfig> items) {
super(activity, resourceId, items);
this.activity = activity;
}
class ImageListViewHolder {
ImageView imageView;
TextView nameView;
TextView descriptionView;
TextView statView;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageListViewHolder holder = null;
WebMediumConfig config = getItem(position);
LayoutInflater mInflater = (LayoutInflater)this.activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_list, null);
holder = new ImageListViewHolder();
holder.imageView = (ImageView)convertView.findViewById(R.id.imageView);
holder.nameView = (TextView) convertView.findViewById(R.id.nameView);
holder.descriptionView = (TextView)convertView.findViewById(R.id.descriptionView);
holder.statView = (TextView)convertView.findViewById(R.id.statView);
convertView.setTag(holder);
} else {
holder = (ImageListViewHolder) convertView.getTag();
}
holder.nameView.setText(Utils.stripTags(config.name));
holder.descriptionView.setText(Utils.stripTags(config.description));
holder.statView.setText(config.stats());
if (MainActivity.showImages) {
HttpGetImageAction.fetchImage(this.activity, config.avatar, holder.imageView);
} else {
holder.imageView.setVisibility(View.GONE);
}
return convertView;
}
}