ListView-加载不可见项目的图像(使用Android通用图像加载器)



在我的片段中,我有一个项目的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);

最新更新