【发布时间】:2016-08-10 02:39:18
【问题描述】:
我正在尝试替换 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 旨在将空白的水分/光照/等片段加载到屏幕上。这打算在启动时发生。 else 语句在用户按下导航抽屉中包含一些数据的项目时执行。然后提取此数据并将其设置为用于替换初始空白片段的片段的参数。
我非常感谢任何帮助。这个问题快把我逼疯了。
【问题讨论】:
标签: java android android-fragments android-viewpager android-tablayout