私は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
ステートメントは、ユーザーがナビゲーションドロワー内の項目を押したときに実行されます。次に、このデータは抽出され、初期ブランクフラグメントを置き換えるフラグメントの引数として設定されます。
私は本当に助けていただきありがとうございます。この問題は私を夢中にさせている。
最初に(そのメソッドが存在することを知る前に)いくつかの問題があったので、同じことを示唆したhttp://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpagerと他のいくつかの投稿に続きました。私はそれがどのように進むのかを知らせます。 –
ところで、あなたは常に各位置に同じフラグメントクラスを保持しているので、フラグメントを保持しているので、コードを再設計する必要があります。フラグメントを置き換えるべきではありません。保持しているフラグメントを変更して、新しい値を表示してください。使用しているコードは、位置の異なるフラグメントクラスを変更する場合にのみ必要です。 – lionscribe
さて、わかりました。これは、起動時にタブの初期化を過ぎてgetItemメソッドを使用しないでください。 –