一、ViewPager的基本使用
ViewPager的适配器是PagerAdapter,如FragmentPagerAdapter或FragmentStatePagerAdapter,实现一个PagerAdapter,必须至少覆盖以下方法:
1.instantiateItem(ViewGroup, int)
2.destroyItem(ViewGroup, int, Object)
3.getCount()
4.isViewFromObject(View, Object)
public class MyViewPagerAdapter extends PagerAdapter{
private List<View> mListViews;
public MyViewPagerAdapter(List<View> mListViews) {
this.mListViews = mListViews;//构造方法,参数是我们的页卡,这样比较方便。
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mListViews.get(position));//删除页卡
}
@Override
public Object instantiateItem(ViewGroup container, int position) { //这个方法用来实例化页卡
container.addView(mListViews.get(position), 0);//添加页卡
return mListViews.get(position);
}
@Override
public int getCount() {
return mListViews.size();//返回页卡的数量
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;//官方提示这样写
}
}
二、ViewPager加载机制
(1)强制刷新
Viewpager在调用notifyDataSetChanged()时,界面无刷新。
getItemPosition()方法默认返回POSITION_UNCHANGED,可以修改适配器的写法,覆盖getItemPosition()方法,当调用notifyDataSetChanged时,让getItemPosition方法人为的返回POSITION_NONE,从而达到强迫viewpager重绘所有item的目的。
这种方法的弊端大家都很容易看出来,我不需要刷新的项目也被重新加载了,浪费系统资源; 如果ViewPager要刷新单个页面,可以在instantiateItem时给每个view加上tag,然后在需要刷新页面时通过View.getTag()来判断是否是我们想要刷新的页面,只给当前页面返回POSITION_NONE。
(2)避免刷新,使用缓存
setOffscreenPageLimit方法可以设置缓存几个页面,这样在不重写getItemPosition的情况下,在缓存范围内的页面都不会被重新加载,ViewPager默认的缓存页面是3个,如果设置一个较大的缓存数量,可以提升用户体验,但是会对内存占用比较大。如果重写了getItemPosition并且返回POSITION_NONE,这个方法就不起作用了,无论如何都会刷新。
三、ViewPager的常用设置
1)mViewPager.setOffscreenPageLimit(2);//设置缓存view 的个数(实际有3个,缓存2个+正在显示的1个)
2)mViewPager.setPageMargin((int)getResources().getDimensionPixelOffset(R.dimen.ui_5_dip));//设置viewpager每个页卡的间距,与gallery的spacing属性类似