禁止ViewPager的滑动
app通常导航栏可以点击,但viewpager是不可以滑动的,这是怎么实现的呢?
实现原理:
创建类NoScrollViewPager
继承ViewPager
,通过重写onInterceptTouchEvent(MotionEvent ev)
和 onTouchEvent(MotionEvent ev)
实现不可滑动,在布局和代码中直接饮用NoScrollViewPager
即可。
代码:
/**
* Created by ${cqc} on 2016/9/8.
* 禁止viewpager的滑动
*/
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context) {
super(context);
}
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//是否拦截事件向内部传递,true:拦截; false:不拦截.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
//viewpager本身是否处理事件,true:处理; false:不处理.
@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
}
}
ViewPager的Adapter
1 ViewPager的adapter是PagerAdapter+FragmentPagerAdapter
PagerAdapter使用广泛
FragmentPagerAdapter用于:ViewPager中存放的是Fragment。
2 PagerAdapter重写的4个方法:
getCount() 数据的数量
isViewFromObject(View view,Object object)返回 view == object
instantiateItem(ViewGroup container,int position) :往ViewGroup中添加子view
destroyItem(ViewGroup container,int position,Object object) 从ViewGroup中移除子view
3 ViewPager里面放的是Fragment的时候,用FragmentPagerAdapter
3-1需要重写的2个方法
getCount() 数据的数量
getItem(int position) 返回position对应的fragment
ViewPager嵌套ViewPager引起的java.lang.IndexOutOfBoundsException
解决方法:
外部ViewPager设置加载页数
viewPager.setOffscreenPageLimit(3);
数量>=内部ViewPager的页面数
FragmentPagerAdapter 与 FragmentStatePagerAdapter的区别?
FragmentPagerAdapter:当设置缓存页面数量N后,那么会缓存N个页面。
FragmentStatePagerAdapter:没有缓存,如果页面太多,都缓存的话内存压力比较大,所以有了FragmentStatePagerAdapter。当页面不可见时,一般会销毁掉fragment,官方用的是maybe destroy