ViewPager的那些事

目录:

一、禁止点击tag时ViewPager滚动的过渡动画。
二、解决adapter的notifyDataSetChanged()无效问题。
三、设置ViewPager的预加载页数。
四、禁止ViewPager手势左右切换的操做。
五、ViewPager左右滑动的惯性消失的bug。
六、ViewPager与子View进行通讯。java


一、禁止点击tag时ViewPager滚动的过渡动画:

当咱们的ViewPager绑定了TabLayout控件的时候,一般都有点击一个tab实现切换ViewPager的功能,可是若是在切换时不想要那个切换动画,该如何作? **解决方案:**其实很简单,关键代码就一句:缓存

//第二个参数就是禁止滚动过渡的效果
mViewPager.setCurrentItem(0, false);
复制代码

二、解决adapter的notifyDataSetChanged()无效问题:

若是想实现ViewPager的数据更新,在调用adapter的notifyDateSetChanged()会发现并无效果,其实并不是没有效果,日后滑动两页到第三页会发现,除了ViewPager默认缓存的那三页数据没有刷新以外,后面的(第三页以后)数据都是刷新了的,这时再返回第一页会发现第一页的数据也发生变化了。 **解决方案:**复写adapter的getItemPosition方法,返回POSITION_NONE便可。ide

public int getItemPosition(Object object) {    
  return POSITION_NONE;
}
复制代码

存在的问题:这不是PagerAdapter中的Bug,一般状况下,调用notifyDataSetChanged方法会让ViewPager经过Adapter的getItemPosition方法查询一遍全部child view,这种状况下,全部child view位置均为POSITION_NONE,表示全部的child view都不存在,ViewPager会调用destroyItem方法销毁,而且从新生成,加大系统开销,并在一些复杂状况下致使逻辑问题。特别是对于只是但愿更新child view内容的时候,形成了彻底没必要要的开销。更有效地方法:更为靠谱的方法是因地制宜,根据本身的需求来实现notifyDataSetChanged的功能,好比,在仅须要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在须要更新信息时,经过findViewWithTag的方法找到对应的View进行更新便可。动画


三、设置ViewPager的预加载页数:

ViewPager默认会预加载左右两页的内容,若是想预加载更多,只需调用ViewPager的setOffscreenPageLimit()便可。this

mViewPager.setOffscreenPageLimit(2); // 设置缓存view 的个数(实际有3个,缓存2个+正在显示的1个)
复制代码

四、禁止ViewPager手势左右切换的操做:

**解决方案:**自定义View继承自ViewPager,代码以下:spa

public class ViewPagerEx extends ViewPager{
    private boolean isPagingEnabled = true;

    public ViewPagerEx(Context context) {
        super(context);
    }
    public ViewPagerEx(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean canScroll) {
        this.isPagingEnabled = canScroll;
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, smoothScroll);
    }
}
复制代码

使用方法:code

mViewPager.setPagingEnabled(false);//禁止左右滑动
mViewPager.setPagingEnabled(true);//开启左右滑动
复制代码

五、ViewPager左右滑动的惯性消失的bug。

检查下FragmentPagerAdapter的构造方法是否是传了getFragmentManager()?若是是,改成getChildFragmentManager()便可,没错,就是这么简单。继承


六、ViewPager与子View进行通讯。

好比我想在ViewPager每滑动结束后,通知子View并进行刷新。get

//利用Tag去获取到对应的子View,而后对View进行操做。
 viewPager.findViewWithTag(position);
//在Adapter的instantiateItem方法中给子View设置Tag
view.setTag(position);
复制代码

(不按期更新)it

相关文章
相关标签/搜索