我在查看选项卡中的片段不刷新

时间:2013-02-08 12:54:44

标签: android android-viewpager fragment

我有一个带有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);

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

6 个答案:

答案 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个标签

所以当你在1和2之间切换时,没有任何事情发生在引擎盖下 - 就像他们只是被隐藏/显示一样。

但是当您导航到标签4时,标签1& 2被销毁(onDestroy()调用),因此当你导航回其中任何一个时,它们将被重新创建(onCreate()被调用)。

psykhi所示,您可以setOffScreenPageLimit()为0,这样每次导航时都会创建每个片段。

如果您有兴趣将其他页面保留在内存中以达到性能目的,那么设计时就是这样,您可以使用消息/事件发布系统从标签1发送消息标签2告诉它在标签1上提交表单时更新。

答案 5 :(得分:0)

好的可能是一个迟到的回复,可能会帮助其他人,所以最近我遇到了同样的问题,同时从数据库中获取数据,它只用于显示一次我点击第三个选项卡..我试过上面提到的解决方案但没有真的工作.. fianlly我遇到了Otto 该库允许您在应用程序内进行通信..

只要从db中获取数据,只需将此库用于yourAdapter.notifyDataSetChanged()。

此视频帮助了我很多https://www.youtube.com/watch?v=lVqBmGK3VuA