在我的片段中,我有一个项目的ListView,其中包含一些文本和一个占据整个屏幕宽度的图像。图像是从URL加载的,我使用的是Android通用图像加载器。
我正在使用一个自定义适配器(extends BaseAdapter
),并以这种方式将其分配给列表:
public class MyAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Offer> offers;
private Context context;
public MyAdapter(Context context, List<Offer> offers) {
super();
this.context = context;
this.inflater = LayoutInflater.from(context);
this.offers = offers;
}
@Override
public int getCount() {
return offers.size();
}
@Override
public Object getItem(int position) {
return offers.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view;
if (convertView == null) {
view = inflater.inflate(R.layout.offer_list_view, parent, false);
} else {
view = convertView;
}
final Offer offer = offers.get(position);
ImageView image = (ImageView) view.findViewById(R.id.offer_list_item_image);
MyImageLoader.getInstance(context).displayImage(offer.getImageUrl(), image); //load the image using the universal image loader
TextView offerTitle = (TextView) view.findViewById(R.id.offer_list_item_title);
offerTitle.setText(offer.getTitle());
return view;
}
}
通常约2.5个项目适合屏幕高度。向下滚动时,会调用adpader的getView方法,并加载下一个图像。这不是最好的用户行为,我希望每次加载超过2-3个项目。
例如,我希望itmes/images#3&4,在开始时不可见,也会被加载,这样当我滚动到它时,它们就已经在那里了。
如何扩展对getView的调用次数,以便填充当前不可见的项目?
适配器就是这样做的,它只加载可见项并一次又一次地回收这些视图。。通用映像加载程序有一个缓存机制,因此一种解决方法是,如果在设置适配器后将所有映像加载到for循环中一次,您的问题就会得到解决,,,!!!!。。(很明显,这些图像只有在提取后才会出现。因此,提取和显示这些图像显然需要同样多的时间,但如果这些图像从互联网上获取后,下次通用图像加载器从您的本地sd卡加载它们,这将立即发生,,,,确保您在使用通用图像加载器时有权写入sd卡)
尝试使用内存和/或磁盘缓存,只有第一次滚动到一行时才会下载图像。这将使滚动非常平滑
DisplayImageOptions displayDefaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true).cacheOnDisc(true).considerExifParams(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory()
.defaultDisplayImageOptions(displayDefaultOptions)
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.build();
ImageLoader.getInstance().init(config);