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

Android viewpager选项卡中的我的片段不刷新,android,android-viewpager,fragment,Android,Android Viewpager,Fragment,我有4个标签的viewpager。。每个选项卡中都有一个片段。 我的第一个选项卡是一个带有表单的片段(例如用户) 单击“保存”后,数据将插入数据库中。 我的第二个选项卡是另一个带有表单的片段,但它使用第一个选项卡中的数据(我从数据库中获取)来填充微调器。 现在,在我成功地从第一个选项卡插入数据之后,在第二个选项卡中,微调器为空。由于我的db查询是在第二个片段的onCreateView()中实现的,因此在应用程序启动时只调用一次,因此在选项卡1和选项卡2之间进行更改不会启动onCreateView

我有4个标签的viewpager。。每个选项卡中都有一个片段。 我的第一个选项卡是一个带有表单的片段(例如用户) 单击“保存”后,数据将插入数据库中。 我的第二个选项卡是另一个带有表单的片段,但它使用第一个选项卡中的数据(我从数据库中获取)来填充微调器。 现在,在我成功地从第一个选项卡插入数据之后,在第二个选项卡中,微调器为空。由于我的db查询是在第二个片段的onCreateView()中实现的,因此在应用程序启动时只调用一次,因此在选项卡1和选项卡2之间进行更改不会启动onCreateView()甚至onResume()。 对我来说,有趣的是,如果我转到tab4,然后返回tab2,我的数据会正确地位于微调器中,因此不知何故,从当前选项卡中滑动两个选项卡,刷新片段。 我的问题是,当onCreateView()只被调用一次时,如何正确刷新片段

编辑 我试着用psykhi建议的方法:

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

但这对我不起作用。我遗漏了什么吗?

这是因为您可以指定viewpager将“保留在RAM中”的片段数(():我认为默认值为1)。所以你的第二个片段不会被重新加载。当你转到第3或第4个选项卡时,你的2个第一片段将被删除,然后在你回来时重新创建


要刷新您的片段,有很多方法:您可以在其中实现自己的侦听器接口来告诉它何时刷新,或者只需调用您将实现的方法来更新内容。

更新:有一种更好的方法,请看这里:



删除此答案的内容,因为这是访问
ViewPager
内部
Fragment
的一种非常糟糕的方法,请查看上面的链接以获得更好的方法。

我发现的模拟“setOffscreenPageLimit(0)”的最佳方法行为是通过使用OnPageChangeListener并重写适配器中的getItemPosition方法实现的。大概是这样的:

在自定义寻呼机适配器中:

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

这与将OffscreenPageLimit设置为0的效果相同。但是,这一功能与ViewPager的设计目的有点矛盾。如果您试图以这种方式实现ViewPager,可能需要重新评估您的布局,以确保ViewPager确实是您想要使用的内容。

根据我的经验,ViewPager保留:

  • 您当前的选项卡
  • &内存中任意一侧的1个选项卡
因此,当你在1和2之间切换时,引擎盖下什么也没有发生——就像它们只是被隐藏/显示一样

但是,当您导航到选项卡4时,选项卡1和2将被销毁(调用onDestroy()),因此当您导航回其中一个选项卡时,它们将被重新创建为新的(调用onCreate())

正如建议的那样,您可以将其设置为0,这样每次导航到它时都会创建每个片段


如果您有兴趣将其他页面保留在内存中以提高性能,因为它们是用this is mind设计的,您可以使用消息/事件发布系统将消息从选项卡1发送到选项卡2,告诉它在您提交选项卡1上的表单时进行更新

Ok可能是一个迟来的回复,将来可能会帮助其他人,所以最近我在从db获取数据时遇到了同样的问题,而db只在单击第三个选项卡时才会显示。。我试过上面提到的解决办法,但没有真正奏效。。最后我遇到了 此库允许您在应用程序内进行通信

只要将此库用于Adapter.notifyDataSetChanged(),无论您从db获取数据的位置


这段视频帮助了我很多

片段方法中的第一次重写

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

}

是的,那就行了。我想知道的是
setOffscreenPageLimit
方法,为什么要将两个选项卡移开,然后返回到原始选项卡,直到再次调用我的onCreateView。
setOffscreenPageLimit()
的默认值为1。这意味着当前选项卡每侧的1将被初始化/缓存。当您离开2个选项卡时,相关选项卡将被取消缓存/销毁。所以回来后会再次启动它,这次一切都会正常运行。每次我滚动它时,应用程序都会崩溃,并显示错误
cast exception:package.fragment无法强制转换到package.fragment$refreshlistener
Hello它给出了java.lang.ClassCastException:what to do。。。urgent@Virus使用这里提到的机制@病毒这就是为什么ViewPager中的页面缓存首先被引入的原因-为了消除滞后现象,它的行为如下。。对于初学者来说,有人会认为android studio是wierdi。我认为复制、粘贴片段结构和修改是造成这个问题的原因(因为它在xml文件中确实存在,在xml文件中,您可以在一个地方重构id,而id在任何地方都会发生变化)。。所以我想可能会有一些wierd链接,但这是完全不同的。。。