ViewPager 不更新片段
ViewPager not updating fragments
我正在尝试替换 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)
方法重写为始终 return POSITION_NONE,并在适当的时候调用 notifyDataSetChanged()(我认为)。最终发生的是 notifyDataSetChanged()
调用 getItem(0)
,后者调用 `notifyDataSethanged()... 等等。这会导致 TransactionTooLargeException 并使应用程序崩溃。
只是为了在每种情况下为 if/else
语句提供一些背景信息:if
旨在将空白 Moisture/Light/etc 片段加载到屏幕上。这是为了在启动时发生。 else
语句在用户按下导航抽屉中包含一些数据的项目时执行。然后提取此数据并将其设置为用于替换初始空白片段的片段的参数。
我真诚地感谢任何帮助。这个问题快把我逼疯了。
为什么要重新创建片段,什么时候可以更新旧片段?
此外,当您在 getItem 期间调用 notifyDataSetChanged 时,您将强制对 getItem 进行新的调用,这将强制进行新的调用...所以您实际上是在创建循环调用!
由于您始终在每个位置保留相同的片段class,并且您一直在坚持该片段,因此您不应该替换片段。只需更改您持有的片段即可显示新值。仅当您想更改位置的不同片段 classes 时才需要您使用的代码。
我正在尝试替换 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)
方法重写为始终 return POSITION_NONE,并在适当的时候调用 notifyDataSetChanged()(我认为)。最终发生的是 notifyDataSetChanged()
调用 getItem(0)
,后者调用 `notifyDataSethanged()... 等等。这会导致 TransactionTooLargeException 并使应用程序崩溃。
只是为了在每种情况下为 if/else
语句提供一些背景信息:if
旨在将空白 Moisture/Light/etc 片段加载到屏幕上。这是为了在启动时发生。 else
语句在用户按下导航抽屉中包含一些数据的项目时执行。然后提取此数据并将其设置为用于替换初始空白片段的片段的参数。
我真诚地感谢任何帮助。这个问题快把我逼疯了。
为什么要重新创建片段,什么时候可以更新旧片段?
此外,当您在 getItem 期间调用 notifyDataSetChanged 时,您将强制对 getItem 进行新的调用,这将强制进行新的调用...所以您实际上是在创建循环调用!
由于您始终在每个位置保留相同的片段class,并且您一直在坚持该片段,因此您不应该替换片段。只需更改您持有的片段即可显示新值。仅当您想更改位置的不同片段 classes 时才需要您使用的代码。