ViewPager无限循环翻页-图片幻灯片

ViewPager可以实现让用户左滑动和右滑动页面。ViewPager最常用的是和Fragment配合使用,这种方式很方便的用来提供和管理每个页面的生命周期。使用ViewPager和Fragment配合,最常见的适配器是使用FragmentPagerAdapter和FragmentStatePagerAdapter。本文只说明怎么使用ViewPager实现无线循环的图片幻灯片展示。

不介绍详细步骤,有需要帮助的可以直接留言。直接说重点:PagerAdapter。为什么这里不用Fragment来实现图片的循环,是因为Fragment需要管理生命周期,很容易出现的问题就是Fragment你不能去重复利用它,因为重复利用会让你Fragment中的图片显示有问题,很多时候加载不出来图片。如果你不缓存就能够加载出来图片(很多其他类似教程是这样做的),这样做有一个问题,它会一直消耗系统内存并不会释放,资源耗尽app就是直接崩溃,所以使用Fragment作为图片容器的时候一定特别小心(需要对Fragment理解深刻)。以后会介绍怎么使用Fragment来加载图片实现同样的功能。

public class ImagePagerAdapter extends PagerAdapter
{
    private ArrayList<String> mData;

    public ImagePagerAdapter(Context context, ArrayList<String> urls)
    {
        mData = urls;
    }
    /**
     * 判断对象是否一样,它的结果影响PagerAdapter是否
     * 需要重新去调用instantiateItem方法,一般直接像下面这样写
     *
     * @return
     */
    @Override
    public boolean isViewFromObject(View view, Object object)
    {
        return view == object;
    }

    ImageLoader mImageLoader;
    /**
     * 实例化需要显示的对象,这里直接使用ImageView,每一次通过xml去加载一个ImageView对象,然后添加到
     * 容器中。
     *
     * @return
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position)
    {
        // 这里使用google的volley来下载图片,可以使用其他下载图片的方式
        // 这里主要工作是用来实例化视图,然后绑定数据。
        NetworkImageView networkImageView = (NetworkImageView) LayoutInflater.from(container.getContext()).inflate(R.layout.layout_viewpager_image,
                container, false);
        networkImageView.setImageUrl(mData.get(position % mData.size()).getSrc(), mImageLoader);
//        networkImageView.setDefaultImageResId(R.drawable.ic_no_data);
        container.addView(networkImageView);
        return networkImageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object)
    {
        if (container != null)
        {
            container.removeView((View) object);
        }
    }

    @Override
    public int getCount()
    {
        return mData.get(position % mData.size();
    }
}

这个类主要有3个方法很重要:

public Object instantiateItem(ViewGroup container, int position);// 实例化视图
public void destroyItem(ViewGroup container, int position, Object object);//销毁其他多余页面的时候会回调
public int getCount();//页面的数量

使用:

mViewPager = (ViewPager) findViewById(R.id.viewPager);
mViewPager.setAdapter(mAdapter = new ImagePagerAdapter(this, mArrayList));

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code