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));