美文网首页Android开发经验谈Android技术知识程序员专栏
Android架构师谈:View Pager 性能优化之 无限循

Android架构师谈:View Pager 性能优化之 无限循

作者: 享学课堂 | 来源:发表于2019-07-25 15:55 被阅读8次

    作者:享学课堂Alvin老师

    转载请声明出处!

    ViewPager实现无限滑动

    方案一:将viewpager上限设置成一个很大的数,第一个页面设置到中间。然后滑动的时候,用当前的序号与viewpager页面数取余得到目标页面的序号,然后显示出来。理论上一个人不会无聊到一直左滑或者右滑。因此可以模拟无限循环。

    方案二:假设viewpager中有四个页面,分别为A、B、C、D。然后在A左边添加一个页面D,在D右边添加一个页面A,变成 D、A、B、C、D、A。当滑到D时跳转到D,滑到A时跳转到A。

    第一种并不是实现了真正意义上的无限循环,但是效果比较好,页面切换的时候也不会出现跳转闪烁的情况。

    第二种虽然是真正的无限循环,但是需要在开头结尾添加元素,这样就会造成其他问题,比如图片下方跟随图片切换的小圆点的设置就会比较复杂。更新数据的时候也比较费劲。而且还会在切换页面时出现闪烁,影响用户体验。因此选择第一种实现方案。

    第一种方案又会有两种实现:实现A,实现B

    实现A:

    实现过程:直接在getItem和 getCount中修改

    @Override
    public Fragment getItem(int i) {
        return fragmentList.get(i% fragmentList.size());
    }
    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }
    

    暴露异常:出现bug

    java.lang.IllegalStateException: Fragment already active
            at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:620)
            at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:117)
    

    修改方案: Fragment 数量不能低于4个,给viewPager添加了一个fragment问题解决。

    实现B:

    同样的,让后再Fragment 数量是4个的基础上继续实现方案的另一个实现B:

    @Override
    public Fragment getItem(int i) {
        //在这里不处理position的原因是因为getItem方法在        
        //instantiateItem方法中调用。只要在调用前处理        
        //position即可,以免重复处理
        return fragmentList.get(i);
    }
    @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
        position = position % fragmentList.size();
        return super.instantiateItem(container, position);
    }
    @Override
        public int getCount() {
        return Integer.MAX_VALUE;
    }
    @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        position = position % fragmentList.size();
        super.destroyItem(container, position, object);
    }
    

    以上实现A和实现B均只能实现右滑的效果,无法实现无限左滑,这个是为什么呢?

    解决办法,在ViewPager配置的地方添加一行代码:

    mViewPager.setCurrentItem(fragmentList.size() * 100);
    

    这样就解决了不能左滑的问题,因为用户不会死死的循环几百次,而这个数字确实可以保证用户左右死循环般的存在。

    如果觉得写的不错,关注一下,后续有更多干货分享

    相关文章

      网友评论

        本文标题:Android架构师谈:View Pager 性能优化之 无限循

        本文链接:https://www.haomeiwen.com/subject/dodhrctx.html