FragmentPagerAdapter与FragmentStatePagerAdapter的区别
在Android开发中,ViewPager控件配合fragment能做很多具有想象力的事情,那么在viewPager中动态加载fragment时,适配器选用那个呢。FragmentPagerAdapter与FragmentStatePagerAdapter的区别到底是什么。听了一节课,抓紧做个记录。
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>
登录后可以发表评论与回复。
还没有评论,来做第一个发言的人。