viewpager选项卡中的我的片段不刷新

我有Viewpager与4个选项卡..在每个选项卡中有一个片段。 我的第一个选项卡是一个表单(例如用户),我点击保存后,数据插入到数据库中的片段。 我的第二个选项卡是另一个forms的片段,但它使用来自第一个选项卡(我从数据库中获取)的数据填充微调。 现在,我成功地从我的第一个标签插入数据后,在我的第二个标签中,微调框是空的。 因为我的数据库查询是在第二个片段中的onCreateView()中实现的,所以在应用程序启动时它只调用一次,所以在tab 1之间切换tab2不会启动onCreateView()甚至onResume()。 对我来说有趣的是,如果我去tab4,然后返回到tab2,我的数据是在我的微调正确,所以不知何故从我当前的标签刷新我的片段远离两个选项卡。 我的问题是我怎么才能实现适当的刷新我的片段时只调用一次onCreateView()?

编辑我试图把这种方法psykhibuild议像这样:

this.mViewPager.setOffscreenPageLimit(0); this.mViewPager.setAdapter(this.mPagerAdapter); this.mViewPager.setOnPageChangeListener(this); 

但它不适合我 我错过了什么?

Solutions Collecting From Web of "viewpager选项卡中的我的片段不刷新"

更新:有一个更好的方法,请看看这里: dynamic更新ViewPager?


删除这个答案的内容,因为这是一个非常糟糕的方式来访问ViewPager Fragment ,请参阅上面的链接更好的方法。

我发现模拟“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相同。但是,此function与ViewPager旨在提供的function有些相似。 如果您试图以这种方式实现ViewPager,可能需要重新评估您的布局,以确保ViewPager真的是您想要使用的。

这是因为你可以指定你的viewpager将保留在内存中的片段数( setOffScreenPageLimit ():我认为默认值是1)。 所以你的第二个片段不重新加载。 而当你进入选项卡3或4时,你的2首先片段被删除,然后当你回来时重新创build。

要刷新你的片段,有很多方法可以做到这一点:你可以实现一个你自己的侦听器接口来告诉它什么时候刷新,或者只是调用一个方法,你会实现更新你的内容。

对于基本的开发人员来说,接受的答案不太清楚,这就是为什么添加了简单的解 经过漫长的奋斗寻找工作解

只要通知你的适配器 ,它的工作令人惊叹,

参考代码

  void setAdapter(int position) { PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(pagerAdapter); // when notify then set manually current position. viewPager.setCurrentItem(position); pagerAdapter.notifyDataSetChanged(); } 

当您设置适配器并且想要刷新UI时调用此代码。

在你的片段中添加下面的代码来刷新UI

 ((YourActivityName) getContext()).setAdapter(selectedTabPosition); 

使用instanceof来build立上下文。

这个代码共享只有帮助的目的谁find工作解决scheme,用最less的代码

首先在fragment方法中重载

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ actionView();//call the method to be refreshed } else{ //no } } 

根据我的经验,ViewPagers保留:

  • 您目前的标签
  • 内存中的任何一方都有1个标签

所以当你在1和2之间切换的时候,引擎盖下面什么都没有发生 – 就像他们被隐藏/显示一样。

但是,当你导航到标签4时,标签1和2被销毁(onDestroy()调用),所以当你回到任何一个,他们被重新创build(onCreate()调用)。

正如psykhi所build议的那样,您可以将OffScreenPageLimit()设置为0,以便每次导航时创build每个片段。

如果您有兴趣将其他页面保留在内存中以达到性能目的, 因为它们是以此为devise思路的 ,您可以使用消息传递/事件发布系统从标签1向标签2发送一条消息,告诉它在您提交时进行更新选项卡上的表单1。

确定可能是一个迟到的答复,可能会帮助其他人在将来,所以最近我面临同样的问题,而从数据库获取数据到它只用于显示一次,我单击第三个选项卡上显示..我尝试了上述解决scheme,但没有真正的工作..最终我碰到了Otto这个库允许你在你的应用程序中进行通信。

只要使用这个库到yourAdapter.notifyDataSetChanged()无论你从数据库中获取你的数据..

这个video帮了我很多https://www.youtube.com/watch?v=lVqBmGK3VuA