我有一个带有4个标签的viewpager ..在每个标签中都有一个片段。 我的第一个标签是带有表单的片段(例如用户) 单击“保存”后,数据将插入数据库中。 我的第二个选项卡是另一个带有表单的片段,但它使用来自第一个选项卡的数据(我从数据库中获取它)来填充微调器。 现在,在我从第一个选项卡成功插入数据后,在我的第二个选项卡中,微调器是空的。由于我的db查询是在第二个片段中的onCreateView()中实现的,因此在应用程序启动时只调用一次,因此在tab 1 i tab2之间进行更改不会在onCreateView()甚至onResume()上启动。 对我来说有趣的是,如果我转到tab4然后返回到tab2,我的数据正好在我的微调器中,所以不知何故从我当前的选项卡中刷出两个选项卡来刷新我的片段。 我的问题是,当onCreateView()只调用一次时,如何才能对我的片段进行适当的刷新?
修改 我试图把那个方法psykhi建议那样:
this.mViewPager.setOffscreenPageLimit(0);
this.mViewPager.setAdapter(this.mPagerAdapter);
this.mViewPager.setOnPageChangeListener(this);
但它不适合我。我错过了什么吗?
答案 0 :(得分:14)
更新:还有更好的方法,请看一下:Update ViewPager dynamically?
删除此答案的内容,因为这是访问Fragment
内部ViewPager
的一种非常糟糕的方式,请参阅上面的链接以获得更好的方法。
答案 1 :(得分:10)
我发现模拟“setOffscreenPageLimit(0)”行为的最佳方法是使用OnPageChangeListener并重写适配器中的getItemPosition方法。像这样:
在自定义寻呼机适配器中:
@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
}
}
这与将OffscreenPageLimit设置为0具有相同的效果。但是,此功能与ViewPager旨在提供的功能相悖。如果您尝试以这种方式实现ViewPager,可能需要重新评估您的布局,以确保ViewPager确实是您想要使用的。
答案 2 :(得分:2)
这是因为你可以指定你的viewpager将“保留在RAM中”的片段数量(setOffScreenPageLimit():我认为默认值是1)。所以你的第二个片段没有重新加载。当你转到标签3或4时,你的2个第一个片段被删除,然后当你回来时重新创建。
要刷新片段,有很多方法可以实现:您可以在其中实现自己的侦听器接口,告诉它何时刷新,或者只是调用您要实现的方法来更新内容。
答案 3 :(得分:2)
片段方法中的第一个覆盖
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser){
actionView();//call the method to be refreshed
}
else{
//no
}
}
答案 4 :(得分:1)
根据我的经验,ViewPagers保留:
所以当你在1和2之间切换时,没有任何事情发生在引擎盖下 - 就像他们只是被隐藏/显示一样。
但是当您导航到标签4时,标签1& 2被销毁(onDestroy()调用),因此当你导航回其中任何一个时,它们将被重新创建(onCreate()被调用)。
如psykhi所示,您可以setOffScreenPageLimit()为0,这样每次导航时都会创建每个片段。
如果您有兴趣将其他页面保留在内存中以达到性能目的,那么设计时就是这样,您可以使用消息/事件发布系统从标签1发送消息标签2告诉它在标签1上提交表单时更新。
答案 5 :(得分:0)
好的可能是一个迟到的回复,可能会帮助其他人,所以最近我遇到了同样的问题,同时从数据库中获取数据,它只用于显示一次我点击第三个选项卡..我试过上面提到的解决方案但没有真的工作.. fianlly我遇到了Otto 该库允许您在应用程序内进行通信..
只要从db中获取数据,只需将此库用于yourAdapter.notifyDataSetChanged()。