1

私はViewPagerのフラグメントを置き換えようとしていますが、私は数日間修正できなかった問題に直面しています。私はそれを理解し、関連するコードや特定の問題は、以下に記載されていますViewPagerがフラグメントを更新していません

public class ViewPageAdapter extends FragmentStatePagerAdapter { 
int mNumOfTabs; 
FragmentManager mFragmentManager; 
Fragment0 currentFragment0; 
Fragment1 currentFragment1; 
Fragment2 currentFragment2; 
boolean getItemNeverCalled = true; 

public ViewPageAdapter(FragmentManager fm, int numOfTabs){ 
    super(fm); 
    mFragmentManager = fm; 
    this.mNumOfTabs = numOfTabs; 
} 

@Override 
public Fragment getItem(int position){ 
    switch (position){ 
     case 0: 
      if(currentFragment0 == null){ 
       Fragment0 tab0 = new Fragment0(); 
       currentFragment0 = tab0; 
       return currentFragment0; 

      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment0).commit(); 
       int value = selectedPlant.getMoistureFrag().getStat().getOptimalLevel(); 
       currentFragment0 = Fragment0.newInstance(key0, value); 
       notifyDataSetChanged(); // calls getItem(0). 

       return currentFragment0; 
      } 
     case 1: 
      if(currentFragment1 == null){ 
       LightFragment tab1 = new Fragment1(); 
       currentFragment1 = tab1; 

       return currentFragment1; 
      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment1).commit(); 
       int value = selectedPlant.getLightFrag().getStat().getOptimalLevel(); 
       currentFragment1 = currentFragment1.newInstance(key1, value); 
       notifyDataSetChanged(); 

       return currentFragment1; 
      } 
     case 2: 
      if(currentFragment2 == null){ 
       Fragment2 tab2 = new Fragment2(); 
       currentFragment2 = tab2; 

       return currentFragment2; 
      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment2).commit(); 
       int value = selectedPlant.getTempFrag().getStat().getOptimalLevel(); 
       currentFragment2 = Fragment2.newInstance(key2, value); 
       notifyDataSetChanged(); 

       return currentFragment2; 
      } 

     default: 
      return null; 
    } 
} 



@Override 
public int getCount(){ 
    return mNumOfTabs; 
} 

@Override 
public int getItemPosition(Object object){ 
      return POSITION_NONE; 
} 

私はいつもPOSITION_NONEを返すようにgetItemPosition(Object object)メソッドをオーバーライドしました、とnotifyDataSetChangedと呼ばれる()(と思う)適切な場合。何が起きるのかは、notifyDataSetChanged()が `notifyDataSethanged()...などを呼び出すgetItem(0)を呼び出します。これにより、TransactionTooLargeExceptionが発生し、アプリケーションがクラッシュします。

それぞれの場合にif/elseステートメントにいくつかの背景を付けてください:ifは空のモイスチャー/ライト/ etcフラグメントを画面に読み込むためのものです。これは起動時に発生することを意図しています。 elseステートメントは、ユーザーがナビゲーションドロワー内の項目を押したときに実行されます。次に、このデータは抽出され、初期ブランクフラグメントを置き換えるフラグメントの引数として設定されます。

私は本当に助けていただきありがとうございます。この問題は私を夢中にさせている。

答えて

1

なぜ世界では古いものを更新するだけでフラグメントを作り直すのですか?
また、getItemの間にnotifyDataSetChangedを呼び出すと、新しい呼び出しを強制するgetItemへの新しい呼び出しが強制されているので、実際には循環呼び出しを作成しています!
それぞれの位置に常に同じフラグメントクラスを保持していて、そのフラグメントを保持しているので、フラグメントを置き換えるべきではありません。保持しているフラグメントを変更するだけで、新しい値が表示されます。使用しているコードは、位置の異なるフラグメントクラスを変更する場合にのみ必要です。

+0

最初に(そのメソッドが存在することを知る前に)いくつかの問題があったので、同じことを示唆したhttp://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpagerと他のいくつかの投稿に続きました。私はそれがどのように進むのかを知らせます。 –

+0

ところで、あなたは常に各位置に同じフラグメントクラスを保持しているので、フラグメントを保持しているので、コードを再設計する必要があります。フラグメントを置き換えるべきではありません。保持しているフラグメントを変更して、新しい値を表示してください。使用しているコードは、位置の異なるフラグメントクラスを変更する場合にのみ必要です。 – lionscribe

+0

さて、わかりました。これは、起動時にタブの初期化を過ぎてgetItemメソッドを使用しないでください。 –

関連する問題