最近遇到一个问题,在fragment中有一个spinner,切换他的时候,viewpager里面的子fragment也要加载新的数据,发现设置的bundle与在里面getargument获得的bundle不一致,get到的都是第一次的bundle,最终解决问题是需要重写FragmentPagerAdapter里面的destroyItem方法,完整代码如下:
package cn.com.eado.remotemonitor.adaper; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import cn.com.eado.remotemonitor.Utils.T; /** * viewpager每一页均为fragment的adapter适配器; * Created by lcy on 2015/10/28. */ public class MyFragmentPagerAdapter extends FragmentPagerAdapter { ArrayList<Fragment> listFragments; public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> al) { super(fm); listFragments = al; } public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return listFragments.get(position); } @Override public int getCount() { return listFragments.size(); } //这个注意要重写; @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); if (position <= getCount()) { FragmentManager manager = ((Fragment) object).getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment) object); trans.commit(); } } }
listFragments = new ArrayList<>(); energyFragment = EnergyFragment.newInstance(currentPID); monthFragment = MonthFragment.newInstance(currentPID); peakFragment =PeakFragment.newInstance(currentPID); listFragments.add(energyFragment); listFragments.add(monthFragment); listFragments.add(peakFragment); adapter=new MyFragmentPagerAdapter(fm, listFragments); viewPager.setAdapter(adapter);