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; 
} 

我已經重寫了getItemPosition(Object object)方法總是返回POSITION_NONE,並呼籲notifyDataSetChanged()在適當的時候(我認爲)。最後發生的是notifyDataSetChanged()調用getItem(0),它調用`notifyDataSethanged()...等等。這會導致TransactionTooLargeException並使應用程序崩潰。

只是爲了給每種情況下的if/else語句提供一些背景知識:if用於在屏幕上加載空白的Moisture/Light/etc碎片。這是爲了在啓動時發生。當用戶按下具有一些數據的導航抽屜中的項目時,將執行else語句。然後提取此數據並將其設置爲用於代替初始空白片段的片段的參數。

我真的很感謝任何幫助。這個問題讓我瘋狂。

回答

1

爲什麼在這個世界上你會重新創造碎片,當你可以更新舊碎片?
此外,當您在getItem期間調用notifyDataSetChanged時,您將迫使一個新的getItem調用,這將強制一個新的調用...所以您實際上正在創建一個循環調用!
由於您始終在每個位置保留相同的片段類,並且您堅持片段,因此您不應該替換片段。只需更改您持有的片段即可顯示新值。您正在使用的代碼僅在需要更改不同片段類別的位置時才需要。

+0

最初有一些麻煩(在我知道該方法存在之前),所以我遵循http://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpager和其他幾個建議相同的東西。我會讓你知道它是怎麼回事。 –

+0

順便說一句,既然你總是保持在每個位置相同的片段類,你堅持的片段,那麼你應該重新設計你的代碼。您不應該替換片段,只需更改您持有的片段即可顯示新值。您正在使用的代碼僅在需要更改不同片段類別的位置時才需要。 – lionscribe

+0

好的,我明白了。這是否意味着我不應該在啓動時通過初始化標籤來使用getItem方法? –