替换片段后ViewPager不刷新

时间:2016-08-10 22:52:42

标签: java android

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

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

片段全部来自相同类型 - > CDMBasicMovieFragment extends Fragment

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

编辑1:

我的视图层次结构:

  • 活动

    • CDMBasicMovieFragment 1
      • ViewPager
        • CDMMovieListFragment
    • CDMBasicMovieFragment 2
      • ViewPager
        • CDMMovieListFragment
    • CDMBasicMovieFragment 3
      • ViewPager
        • CDMMovieListFragment

EDIT2:

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

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

EDIT3:

我找到了一个可能的解决方案: 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);。我想这就是问题所在。但我很困惑......

2 个答案:

答案 0 :(得分:3)

我解决了我的问题。

现在我总是这样替换CDMBasicMovieFragment

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

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

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

答案 1 :(得分:0)

尝试以下代码段,在自定义寻呼机适配器中:

@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
     }
}