【问题标题】:ViewPager not updating fragmentsViewPager 不更新片段
【发布时间】: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


    【解决方案1】:

    您究竟为什么要重新创建片段,而您可以只更新旧片段?
    此外,当您在 getItem 期间调用 notifyDataSetChanged 时,您将强制对 getItem 进行新调用,这将强制进行新调用...所以您实际上是在创建循环调用!
    由于您始终在每个位置保持相同的片段类,并且您一直在保留片段,因此您不应该替换片段。只需更改您持有的片段以显示新值。仅当您想更改不同的片段类的位置时才需要您使用的代码。

    【讨论】:

    • 最初遇到了一些麻烦(在我知道该方法存在之前),所以我关注了stackoverflow.com/questions/7723964/… 和其他几篇提出相同问题的帖子。我会告诉你进展如何。
    • 顺便说一句,因为你总是在每个位置保持相同的片段类,并且你一直在坚持片段,那么你应该重新设计你的代码。您不应该替换片段,只需更改您持有的片段以显示新值。仅当您想更改不同的片段类的位置时才需要您使用的代码。
    • 好的,我明白了。这是否意味着我不应该在启动选项卡的初始化之后使用 getItem 方法?
    • 正确。如果它们可以更新,为什么要更换它们。我将在上面编辑我的答案(如果可以的话)。
    • 好的,我明白了。如果你要我的许可,你有它大声笑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多