Framgment未添加则添加,已添加则通过显示隐藏控制代码

来源:互联网 发布:学士后java 编辑:程序博客网 时间:2024/06/05 12:47

需求:首页有四个tab,点击哪个就显示哪个
最初实现是先全部添加进去,然后通过点击来控制hide,和show,但是这种话方法有个不足,就是初次进入应用一次性全部加载数据,用户体验不好,且一次性加载太消耗资源了,主要不刷新,于是考虑的replece方法,repleace方法的缺点也和明显,就是每次都要destory和create,也相当消耗资源,虽然重新创建数据显示会刷新

解决方法:

初次点击先判断有无添加,记录下当前的position,命名为oldPosition第二次点击的时候,拿到最新的 position,命名为currentPosition进行对比,如果两个position不一样,则判断currentPosition对应的fragment有没有添加,如果没添加,则添加,添加了就直接show出来,commit下,最后把currentPosition赋值给oldPosition

SHOW CODE

   public void changeFragment( int currentPosition) {        fm= getSupportFragmentManager();        FragmentTransaction fragmentTransaction = fm.beginTransaction();        if (currentPosition != oldSelectIndex) {            fragmentTransaction.hide(mFragments[oldSelectIndex]);            if (!mFragments[currentPosition].isAdded()) {                fragmentTransaction.add(R.id.frame_content, mFragments[currentPosition]);            }            fragmentTransaction.show(mFragments[currentPosition]);            fragmentTransaction.commit();        }        oldSelectIndex = currentPosition;    }

以上是主要代码

全部步骤:

  • 在Activity中把四个fragment都实例化出来,创建一个存放fragment的数组,把四个fragment添加进去
  Fragment[] mFragments=new Fragment[4];
        mFragments[0]=mDescFragment;        mFragments[1]=mMaterialFragment;        mFragments[2]=mClassRoomFragment;        mFragments[3]=mChatFragment;

初始化的时候,默认添加第一个fragment

 fm = getSupportFragmentManager();        FragmentTransaction Transaction = fm.beginTransaction();        Transaction.add(R.id.frame_content, mDescFragment)                .commit();

点击不同的tab,index变化从0开始依次,index=0,index=1,index=2。index=3,传入changeFragment中作为参数

  mIndex = 0;  changeFragment(mIndex);

值得注意的问题

FragmentTransaction不能声明为全局变量,是能commit一次,不然会报is alread commit错误,oldPosition和index都要初始化为0

0 0
原创粉丝点击