美文网首页
神奇的viewPager预加载功能

神奇的viewPager预加载功能

作者: 谁动了我的代码QAQ | 来源:发表于2018-09-29 18:44 被阅读0次

    viewPager中嵌套着fragment有预加载功能你知道吗?我开始也是不知道的,后来发现了这个问题,下面来说明一下。首先简单介绍一下viewPager的使用。

    viewPager

    首先在一个Activity中创建一个viewPager,在viewPager中加入三个fragment

     public class MainActivity extends AppCompatActivity {
    
           private ViewPager viewPager;
           private ArrayList<Fragment> list;
           private ViewPagerAdapter adapter;
    
          @Override
           protected void onCreate(Bundle savedInstanceState) {
                     super.onCreate(savedInstanceState);
                     setContentView(R.layout.activity_main);
                     viewPager = findViewById(R.id.viewPager);
                     initViewPager();
           }
    
          private void initViewPager() {
                 list = new ArrayList<Fragment>();
                 Fragment1 fragment1 = new Fragment1();
                 Fragment2 fragment2 = new Fragment2();
                 Fragment3 fragment3 = new Fragment3();
                 list.add(fragment1);
                 list.add(fragment2);
                 list.add(fragment3);
    
                 FragmentManager fragmentManager = getSupportFragmentManager();
                 adapter = new ViewPagerAdapter(fragmentManager, list);
                 viewPager.setAdapter(adapter);
                 viewPager.setCurrentItem(0);
                 viewPager.setOffscreenPageLimit(2);//viewPager预加载,从0开始
                 viewPager.addOnPageChangeListener(new 
                 ViewPager.OnPageChangeListener() {
                         @Override
                         public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                          }
    
                        @Override
                         public void onPageSelected(int position) {
                                 //在这里可以做一些改变按钮的操作。
                         }
    
                        @Override
                        public void onPageScrollStateChanged(int state) {
    
                        }
                });
            }
      }
    

    接下来是重要的adapter:

    public class ViewPagerAdapter extends FragmentPagerAdapter {
    
           private ArrayList<Fragment> fragmentList;
           private FragmentManager fragmentManager;
    
           public ViewPagerAdapter(FragmentManager fm,ArrayList<Fragment> list) {
                    super(fm);
                    this.fragmentManager = fm;
                    this.fragmentList = list;
           }
    
           @Override
           public Fragment getItem(int position) {
                  return fragmentList.get(position);
           }
    
           @Override
           public int getCount() {
                  return fragmentList.size();
           }
     }
    

    ok,来看一下mainActivity中的xml文件,很简单只有一个viewPager。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
             xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context="com.wangrui.viewpagertest.MainActivity">
    
         <android.support.v4.view.ViewPager
                 android:id="@+id/viewPager"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent">
        </android.support.v4.view.ViewPager>
    
    </android.support.constraint.ConstraintLayout>
    

    接下来看一下定义的fragment,因为这里只是demo,fragment中只有一个TextView,所以就只贴出一个了。

     public class Fragment1 extends Fragment {
          @Nullable
          @Override
          public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
                   View view = inflater.inflate(R.layout.fragment1_layout,null);
                   return view;
             }
      }
    

    ok,接下来是Fragment1的xml文件。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
             xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    
         <TextView
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:text="1"
                 android:gravity="center"
                 android:textSize="150dp"
          />
    </LinearLayout>
    

    其他,两个Fragment的代码和布局文件基本是一毛一样的,所以就不重复贴了。然后运行效果是这样的:


    ViewPager效果.gif

    ViewPager预加载

    接下来说一下本节的重点,viewPager的预加载。机智的小伙伴相信已经看到了在设置viewPager的时候有这样一行代码

    viewPager.setOffscreenPageLimit(2);
    

    然后我在三个Fragment的生命周期中都打上log。运行时的log是这样的


    log效果图.png

    可以看到,在运行demo的时候三个fragment全部被创建了。
    当手机屏幕息屏的时候,三个fragment的生命周期是这样的:


    image1.png
    ok,现在把这句代码设置成这样
    viewPager.setOffscreenPageLimit(1);
    

    效果是这样的


    image.png

    当滑动到第二个fragment的时候,可以看到fragment3才开始创建:


    image.png
    当滑动到第三个fragment3的时候,第一个fragment1已经被销毁了
    image.png

    接着测试,把值设置为0试试。

    viewPager.setOffscreenPageLimit(0);
    
    image.png

    可以看到设置为0和1的效果是一样。
    所以可以通过设置n的值来改变预加载fragment的个数

    viewPager.setOffscreenPageLimit(n);

    相关文章

      网友评论

          本文标题:神奇的viewPager预加载功能

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