关于fragment滑动的记录

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();//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展示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值