Java 替换片段后,ViewPager不刷新
我有一个片段列表,可以在导航栏中打开:Java 替换片段后,ViewPager不刷新,java,android,Java,Android,我有一个片段列表,可以在导航栏中打开: getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment).commit(); 这些片段都来自同一类型->CDMBasicMovieFragment扩展片段 在这个片段中,我有一个viewpager,我用getFragmentManager()调用它。这里我有个问题。第一个片段很好,但替换第一个片段后,viewpager为空。然后我
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment).commit();
这些片段都来自同一类型->CDMBasicMovieFragment扩展片段
在这个片段中,我有一个viewpager,我用getFragmentManager()
调用它。这里我有个问题。第一个片段很好,但替换第一个片段后,viewpager为空。然后我将getFragmentManager()
更改为getChildFragmentManager()
。现在所有碎片都好了。但只有一次。在替换回第一个片段之后,我遇到了同样的问题。我做错了什么
Edit1:
我的视图层次结构:
- 活动
- 电影片段1
- 寻呼机
- CDMMovieListFragment
- 寻呼机
- 电影片段2
- 寻呼机
- CDMMovieListFragment
- 寻呼机
- 电影片段3
- 寻呼机
- CDMMovieListFragment
- 寻呼机
- 电影片段1
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, l_Fragment, uniqueFragmentTag).commit();
Edit3:
我找到了一个可能的解决方案:
我尝试了这个链接的所有内容。我已经有同样的问题了。。。有人能帮忙吗
更新:
在密集调试会话之后;)我发现:
加载第一个CDMMovieListFragment
FragmentPagerAdapter的InstanceItem
被调用,并检查是否已经存在片段。这不是它内部调用的原因
mCurTransaction.add(container.getId(),fragment,makeFragmentName(container.getId(),itemId))代码>
当我替换包含fragmentpageradapter的CDMBasicMovieFragment
并尝试加载第二个CDMBasicMovieFragment
时,它仍然是相同的fragmentmanager
FragmentPagerAdapter的实例化项
被调用并找到旧的CDMMovieListFragment
。现在它调用mCurTransaction.attach(fragment)代码>取而代之。我想问题出在这里。但是我很困惑…在您的自定义寻呼机适配器中尝试下面的代码片段:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
然后在包含ViewPager的活动中:
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
}
}
请在自定义寻呼机适配器中尝试以下代码段:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
然后在包含ViewPager的活动中:
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
}
}
我解决了我的问题
现在我总是这样替换CDMBasicMovieFragment
:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, CDMBasicMovieFragment.newInstance()).commit();
调用FragmentPagerAdapter的构造函数时,我将getFragmentManager
更改为getChildFragmentManager
我想我可以一次性创建所有片段,只要单击导航栏(drawner)上的项目就可以替换它们。但是replace
将删除一次创建的片段,当我想再次替换删除的片段时,它不在那里。这就是为什么我有一个空的viewpager。我解决了我的问题
现在我总是这样替换CDMBasicMovieFragment
:
getSupportFragmentManager().beginTransaction().replace(android.R.id.tabcontent, CDMBasicMovieFragment.newInstance()).commit();
调用FragmentPagerAdapter的构造函数时,我将getFragmentManager
更改为getChildFragmentManager
我想我可以一次性创建所有片段,只要单击导航栏(drawner)上的项目就可以替换它们。但是replace
将删除一次创建的片段,当我想再次替换删除的片段时,它不在那里。这就是为什么我有一个空的viewpager。这与你的情况有关吗?mViewPager=(ViewPager)findViewById(R.id.pager);//必须设置OffscreenPageLimit,因为默认值为1,我们有3个选项卡。如果加载程序完成时屏幕外没有一个可用,它将崩溃,否则mViewPager.setOffscreenPageLimit(2);我不想更改viewpager中的片段。我想替换包含viewpager的片段。检查我的编辑。我添加了视图层次结构。我明白了。这有点复杂。这和你的情况有关吗?mViewPager=(ViewPager)findViewById(R.id.pager);//必须设置OffscreenPageLimit,因为默认值为1,我们有3个选项卡。如果加载程序完成时屏幕外没有一个可用,它将崩溃,否则mViewPager.setOffscreenPageLimit(2);我不想更改viewpager中的片段。我想替换包含viewpager的片段。检查我的编辑。我添加了视图层次结构。我明白了。这有点复杂,没什么变化。。。同样的问题也必须在特定的碎片上执行此操作以强制重新加载。工作正常,但有点延迟。没有改变。。。同样的问题也必须在特定的碎片上执行此操作以强制重新加载。工作正常,但有点延迟。太好了。我和你有同样的问题,现在已经解决了。谢谢,太好了。我和你有同样的问题,现在已经解决了。谢谢