FragmentPagerAdapter与FragmentStatePagerAdapter的区别在于当用户滑动空间时。表面上没什么大的区别。但在处理生命周期函数上还是有很大区别的,他们的使用场景也不同。


FragmentPagerAdapter在变化时会执行

onDestoryView(上一个fragment)  onCreateView(下一个fragment)。

FragmentPagerAdapter在执行中并没有被销毁,始终在内存当中的适用于数量比较少的 ViewPager 比如4个Tab,内存比较大的机器;



FragmentStatePagerAdapter在变化时会执行

onDestoryView  onDestory(上一个fragment)  onCreate  onCreateView(下一个fragment)

FragmentStatePagerAdapter被销毁,不在内存中,适用于比较多的 ViewPager 比如1000个以上,图库什么的,内存相对比较小的机器。

在开发中,该如何选择这两个适配器呢,一方面考虑我们的fragment数量多少,另一方面考虑内存大小。还有一个考虑在fragment中所存在的内容获取比较耗时还是很容易,比如网络存取图片和本地存取图片耗时差别是很大的,也就是考虑用户体验。


部分代码示例:

MainActivity.java

import cn.sinocd.wx.viewpagetab.fragment.TabFragment;
//其它系统自动引入库,直接按alt+enter
public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPagerMain;
    private List<String> mTitles = new ArrayList<>(Arrays.asList("首页", "发现", "问答", "我的"));
    private Button mBtnIndex;
    private Button mBtnDiscover;
    private Button mBtnQa;
    private Button mBtnUser;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //  实例化 一组 ViewPager
        mViewPagerMain = findViewById(R.id.vp_main);
        mViewPagerMain.setOffscreenPageLimit( (mTitles.size()-2) );

        mViewPagerMain.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return TabFragment.newInstance(mTitles.get(position));
            }
            @Override
            public int getCount() {
                return mTitles.size();
            }
        });
    }

TabFragment.java

public class TabFragment extends Fragment {
    private TextView mTvTitle;
    private String mTitle;
    private static final String BUNDLE_KEY_TITLE = "";
    //  在这里实例化 Fragment时,外部设置数据,依赖一个静态变量,配合Bundle
    public static TabFragment newInstance(String title){
        Bundle bundle = new Bundle();
        bundle.putString(BUNDLE_KEY_TITLE, title);
        TabFragment tabFragment = new TabFragment();
        tabFragment.setArguments(bundle);
        return  tabFragment;
    }
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //  内部获取数据到变量mTitle
        Bundle arguments = getArguments();
        if(arguments != null){
            mTitle = arguments.getString(BUNDLE_KEY_TITLE, "");
        }
        //L.d("onCreate, title=" + mTitle);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_tab, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //获取到的数据设置到控件
        mTvTitle = view.findViewById(R.id.tv_title);
        mTvTitle.setText(mTitle);
    }
}

两个xml

<androidx.viewpager.widget.ViewPage xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/vp_main"
    tools:context=".MainActivity" />
</androidx.viewpager.widget.ViewPage>


fragment.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textStyle="bold"
        android:textSize="50dp"
        tools:text="只是用来看看预览"
        android:id="@+id/tv_title" />
</FrameLayout>