我試圖在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
語句。然後提取此數據並將其設置爲用於代替初始空白片段的片段的參數。
我真的很感謝任何幫助。這個問題讓我瘋狂。
最初有一些麻煩(在我知道該方法存在之前),所以我遵循http://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpager和其他幾個建議相同的東西。我會讓你知道它是怎麼回事。 –
順便說一句,既然你總是保持在每個位置相同的片段類,你堅持的片段,那麼你應該重新設計你的代碼。您不應該替換片段,只需更改您持有的片段即可顯示新值。您正在使用的代碼僅在需要更改不同片段類別的位置時才需要。 – lionscribe
好的,我明白了。這是否意味着我不應該在啓動時通過初始化標籤來使用getItem方法? –