关于fragment滑动的记录

来源:互联网 发布:dlp mac 编辑:程序博客网 时间:2024/06/18 16:37

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个方法,如下所示。

  1. FragmentPagerAdapter adapter = new FragmentPagerAdapter(  
  2.                 getSupportFragmentManager()) {  
  3.   
  4.             @Override  
  5.             public int getCount() {  
  6.                 return fragments.size();  
  7.             }  
  8.   
  9.             @Override  
  10.             public Fragment getItem(int position) {  
  11.                 return fragments.get(position);  
  12.             }  
  13.             }  
  14.   
  15.         };  



fragmentCitiaoFav = new FragmentCitiaoFav();//FragmentfragmentpicFav = new FragmentpicFav();//第二個FragmentfragList_home.add(fragmentCitiaoFav); //fragList_home.add(fragmentpicFav);//添加adapterViewPagerforshoucang.bindData(fragList_home);//放進adapter,繼承FragmentStatePagerAdapte//可以自動緩存

在adapter中有个geiitem的方法,把fragment取出来

@Overridepublic 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();//FragmentfragmentpicFav = new FragmentpicFav();//第二個FragmentfragList_home.add(fragmentCitiaoFav); //fragList_home.add(fragmentpicFav);//添加adapterViewPagerforshoucang.bindData(fragList_home);//放進adapter,繼承FragmentStatePagerAdapte//可以自動緩存initviewpglistener();vpHome.setAdapter(adapterViewPagerforshoucang);//viewpager展示



0 0