3

他の回答が提案したことを実行しようとしましたが、ログを見ると、getItemPositionがPOSITION_NONEで返された後、位置0がgetItemに対して呼び出されません。また、getItemPositionが返されたときに、destoryItemをオーバーライドしようとしました。呼び出されますが、何も起こりません。

パブリッククラスProvidersActivityPagerAdapterはFragmentPagerAdapterを拡張します{

private ArrayList<String> fragments;

public ProvidersActivityPagerAdapter(FragmentManager fm) {
  super(fm);
  fragments=new ArrayList<String>();
  if(provider.isInitialized()){
    fragments.add(BaseDetailsFragment.class.getName());
  }else{
    fragments.add(BaseAuthFragment.class.getName());
  }
  this.fm=fm;
}

@Override
public int getCount(){
  return fragments.size();
}


@Override 
public int getItemPosition(Object object) {
  AppUtils.logI("Get Item Position: "+POSITION_NONE+" "+object.getClass().getName());
  return POSITION_NONE;
}

@Override
public Fragment getItem(int position) {
  AppUtils.logI("Get Fragment for: "+position);
  String f=fragments.get(position);
  if(f.equals(BaseDetailsFragment.class.getName())){
    return provider.getDetailFragment();
  }
  if(f.equals(BaseAuthFragment.class.getName())){
    return provider.getAuthFragment();
  }
  if(f.equals(BaseSelectorFragment.class.getName())){
    return provider.getCurrentSelector();
  }
  return new Fragment();
}

private void addItem(int loc,String fa,String tag){
  this.fragments.add(loc,fa);
  AppUtils.logI(fragments.toString());
  notifyDataSetChanged(); //only creates the new fragment but not updating the old ones. 
  mViewPager.setCurrentItem(loc);
}
4

1 に答える 1

7

FragmentPagerAdapterのサポートライブラリバージョンは、アイテムの破棄には何もしないようです。したがって、解決策は、ページアダプタを構築するときにフラグメントマネージャを保存し、destoryItem()関数をオーバーライドすることです。これは、サポートライブラリの将来のエディションと互換性がない可能性があることに注意してください。

@Override
public void destroyItem(ViewGroup container,int position,Object object){
  super.destroyItem(container, position, object);
  FragmentTransaction bt = fm.beginTransaction();
  bt.remove((Fragment)object);
  bt.commit();
}
于 2012-08-06T22:39:05.920 に答える