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 时才需要您使用的代码。