【问题标题】:ViewPager does not refresh after replacing fragmentViewPager 替换片段后不刷新
【发布时间】:2016-08-10 22:52:42
【问题描述】:

我有一个片段列表,可以在我的导航栏中打开:

getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment).commit();

片段都来自同一类型 -> CDMBasicMovieFragment extends Fragment

在这个片段中,我有一个viewpager,我用getFragmentManager() 调用它。在这里我有问题。第一个片段很好,但在替换第一个片段后,viewpager 是空的。然后我将getFragmentManager() 更改为getChildFragmentManager()。现在所有片段都很好。但只有1次。替换回第一个片段后,我遇到了同样的问题。我做错了什么?

编辑1:

我的视图层次结构:

  • 活动

    • CDMBasicMovieFragment 1
      • 查看页面
        • CDMMovieListFragment
    • CDMBasicMovieFragment 2
      • 查看页面
        • CDMMovieListFragment
    • CDMBasicMovieFragment 3
      • 查看页面
        • CDMMovieListFragment

编辑2:

我尝试为片段创建唯一 id 并在替换时使用它们,但我已经遇到了同样的问题:

getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment, uniqueFragmentTag).commit();

编辑3:

我找到了一个可能的解决方案: OnCreateView called multiple times / Working with ActionBar and Fragments 我尝试了此链接中的所有内容。我已经遇到了同样的问题...有人可以帮忙吗?

更新:

经过密集的调试会话;)我发现了这个:

当加载第一个CDMMovieListFragment FragmentPagerAdapter 的instantiateItem 被调用并检查是否已经有一个片段。这不是它内部调用的原因

mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));

当我替换包含 fragmentpageradapter 的CDMBasicMovieFragment(内部是添加的CDMMovieListFragment)并尝试加载第二个CDMBasicMovieFragment 时,它仍然是同一个片段管理器。

FragmentPagerAdapter 的instantiateItem 被调用并找到了旧的CDMMovieListFragment。现在它改为调用mCurTransaction.attach(fragment);。我认为这就是问题所在。但是我很困惑...

【问题讨论】:

  • 这与您的情况有关吗? mViewPager = (ViewPager) findViewById(R.id.pager); // 必须设置 OffscreenPageLimit,因为默认值为 1,我们有 3 个选项卡。如果加载程序完成时屏幕外不可用,则会崩溃,否则 mViewPager.setOffscreenPageLimit(2);
  • 我不想更改 viewpager 中的片段。我想替换包含 viewpager 的片段。检查我的编辑。我添加了视图层次结构。
  • 我明白了。这有点复杂。

标签: java android


【解决方案1】:

我解决了我的问题。

现在我总是像这样替换CDMBasicMovieFragment:

getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, CDMBasicMovieFragment.newInstance()).commit();

在调用 FragmentPagerAdapter 的构造函数时,我将 getFragmentManager 更改为 getChildFragmentManager。

我认为我可以一次创建所有片段,如果我单击导航栏(绘图器)的项目,只需替换它们。但是replace 将删除一次创建的片段,当我想再次替换删除的片段时,它不存在。这就是为什么我有一个空的viewpager。

【讨论】:

  • 太棒了。我和你有同样的问题,现在解决了。谢谢。
【解决方案2】:

尝试下面的代码 sn-p,在您的自定义寻呼机适配器中:

@Override
public int getItemPosition(Object object) {
     return POSITION_NONE;
}

然后在包含 ViewPager 的 Activity 中:

final MyPagerAdapter adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
     @Override
     public void onPageSelected(int position) {
          ... anything you may need to do to handle pager state ...
          adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
     }
}

【讨论】:

  • 没有改变...同样的问题
  • 必须在特定片段上执行此操作才能强制重新加载。工作,但引入了一点延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多