FragmentPagerAdapter是Android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter,是专门用来给支持包中出现的ViewPager进行数据适配的。
PagerAdapter在之前的文章中进行过简单的介绍,不记得怎么使用的可以先去看一下。
FragmentPagerAdapter,见名知意,这个适配器就是用来实现Fragment在ViewPager里面进行滑动切换的,因此,如果我们想实现Fragment的左右滑动,可以选择ViewPager和FragmentPagerAdapter实现。
FragmentPagerAdapter拥有自己的缓存策略,当和ViewPager配合使用的时候,会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象。
假如有三个Fragment,那么在ViewPager初始化之后,3个fragment都会加载完成,中间的Fragment在整个生命周期里面只会加载一次,当最左边的Fragment处于显示状态,最右边的Fragment由于超出缓存范围,会被销毁,当再次滑到中间的Fragment的时候,最右边的Fragment会被再次初始化。
在当前版本来说,最适合用来做固定的较少数量的场合,比如说一个有3个tab标签的fragment滑动界面。FragmentPagerAdapter会对我们浏览过Fragment进行缓存,保存这些界面的临时状态,这样当我们左右滑动的时候,界面切换更加的流畅。但是,这样也会增加程序占用的内存。如果应用场景是更多的Fragment,请使用FragmentStatePagerAdapter。
当我们使用FragmentPagerAdapter的时候,它的宿主ViewPager必须有一个id。
如果要使用FragmentPagerAdapter,我们需要实现2个方法,如下所示。
- FragmentPagerAdapter adapter = new FragmentPagerAdapter(
- getSupportFragmentManager()) {
- @Override
- public int getCount() {
- return fragments.size();
- }
- @Override
- public Fragment getItem(int position) {
- return fragments.get(position);
- }
- }
- };
fragmentCitiaoFav = new FragmentCitiaoFav();//Fragment fragmentpicFav = new FragmentpicFav();//第二個Fragment fragList_home.add(fragmentCitiaoFav); // fragList_home.add(fragmentpicFav);//添加 adapterViewPagerforshoucang.bindData(fragList_home);//放進adapter,繼承FragmentStatePagerAdapte //可以自動緩存
在adapter中有个geiitem的方法,把fragment取出来
@Override public Fragment getItem(int position) { return list.get(position); }
平常使用的FragmentPagerAdapter和FragmentStatePagerAdapter来自android.support.v4.app包用来构建ViewPager。
FragmentPagerAdapter更多的用于少量界面的ViewPager,比如Tab。划过的fragment会保存在内存中,尽管已经划过。而FragmentStatePagerAdapter和ListView有点类似,会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉。
要注意的是FragmentStatePagerAdapter可能不经意间会造成内存未正常回收,严重导致内存溢出,比如图片资源没有释放,资源引用问题。(之前碰到过EditTextt由于保存焦点导致Fragment未被释放,以至于内存溢出,设置editText.saveEanble(false)就可以解决此问题)。
下面是viewpager的布局,用来滑动加载内容
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <android.support.v4.view.ViewPager android:id="@+id/vp_home" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="7.05" android:background="@color/white" android:visibility="visible"></android.support.v4.view.ViewPager> </LinearLayout>当点击切换时
rlArea.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { vpHome.setCurrentItem(0); tvArea.setTextColor(getResources().getColor(R.color.topTextColor)); tvTupian.setTextColor(getResources().getColor(R.color.black)); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.show(fragList_home.get(0)); transaction.hide(fragList_home.get(1)); transaction.commit(); viewFriendsUnderline.setVisibility(View.VISIBLE); viewTvGuanzhuUnderline.setVisibility(View.GONE); } });
adapterViewPagerforshoucang = new AdapterViewPagerforshoucang(getSupportFragmentManager()); fragList_home = new ArrayList<Fragment>(); viewFriendsUnderline.setVisibility(View.VISIBLE); fragmentCitiaoFav = new FragmentCitiaoFav();//Fragment fragmentpicFav = new FragmentpicFav();//第二個Fragment fragList_home.add(fragmentCitiaoFav); // fragList_home.add(fragmentpicFav);//添加 adapterViewPagerforshoucang.bindData(fragList_home);//放進adapter,繼承FragmentStatePagerAdapte //可以自動緩存 initviewpglistener(); vpHome.setAdapter(adapterViewPagerforshoucang);//viewpager展示