您的位置:首页 > 其它

ViewPager与Fragment组合时的基本使用方法

2017-01-22 11:25 453 查看
本篇博客记录一下Android支持库中ViewPager的基本用法。

ViewPager的布局文件类似于下面的实例代码:

<?xml version="1.0" encoding="utf-8"?>
<!--ViewPager来自支持库,因此包名需要全称-->
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_crime_pager_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>


ViewPager的使用,类似于前面博客提到的RecyclerView,也是通过自己的Adapter实现视图与数据的绑定。

ViewPager对应的Adapter为PagerAdapter,其实现较为复杂。

不过对于嵌入Fragment的ViewPager而言,Google提供了PagerAdapter的子类FragmentStatePagerAdapter和FragmentPagerAdapter。

这两个子类的使用方式基本一致,我们以FragmentStatePagerAdapter为例,看看使用方式的示例:

public class CrimePagerActivity extends FragmentActivity {
................
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);

mViewPager = (ViewPager) findViewById(R.id.activity_crime_pager_view_pager);

//获取ViewPager需要显示的全部数据
mCrimes = CrimeLab.get(this.getApplicationContext()).getCrimes();

//FragmentStatePagerAdapter和FragmentPagerAdapter需要用到FragmentManager
FragmentManager fm = getSupportFragmentManager();

mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
@Override
//getItem将获取指定位置的数据,然后创建出Fragment
//FragmentStatePagerAdapter将利用到FragmentManager将Fragment添加到Activity中显示
public Fragment getItem(int position) {
Crime crime = mCrimes.get(position);
return CrimeFragment.newInstance(crime.getId());
}

@Override
//这个就是得到全部数据的大小
public int getCount() {
return mCrimes.size();
}
});

UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
for (int i = 0; i < mCrimes.size(); ++i) {
if (mCrimes.get(i).getId().equals(crimeId)) {
//默认情况下,ViewPager启动后,只会显示PagerAdapter中第一个数据对应的视图
//因此,在需要的情况下,可以调用ViewPager的setCurrentItem指定需要显示的列表项
mViewPager.setCurrentItem(i);
break;
}
}
}
............
}


从上面的代码可以看出,ViewPager配合FragmentStatePagerAdapter加载Fragment极其的方便。

在了解基本用法后,我们来了解一下ViewPager的注意事项。

1、为了保证页面切换的流畅性及响应速度,ViewPager默认加载当前屏幕以及左右相邻页面列表项的数据。

如果需要限制加载的范围,可以调用ViewPager的setOffscreenPageLimit(int limit)接口。

2、FragmentStatePagerAdapter和FragementPagerAdapter的用法一致,但使用场景不同。

FragmentStatePagerAdapter:

当滑动视图时,FragmentStatePagerAdapter会销毁掉不需要的Fragment。

销毁Fragment的事务提交后,FragmentManager中对应的fragment会被彻底移除。

使用FragmentStatePagerAdapter时,被销毁Fragment可以在自己的onSaveInstanceState函数中保存必要的信息。

当用户切回该Fragment对应界面时,ViewPager会利用保存的信息重新创建Fragment。

FragementPagerAdapter:

对于不再需要的fragment,FragementPagerAdapter选择调用Fragment事务的detach方法而非remove方法。

于是,FragementPagerAdapter仅会销毁fragment的视图,但对应的fragment实例还保留在FragmentManager的队列中。

根据FragmentStatePagerAdapter和FragementPagerAdapter对fragment的处理策略,

我们可以看出FragmentStatePagerAdapter更节省内存。

当ViewPager绑定了大量的数据时,应该使用FragmentStatePagerAdapter;

当ViewPager只需要显示少量固定的fragment时,为了效率,就可以使用FragementPagerAdapter。

3、当ViewPager托管非fragment视图时,就需要实现原生的PageAdapter接口。

下次使用时,再做记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: