10

我有 4 个选项卡的 viewpager .. 在每个选项卡中都有一个片段。我的第一个选项卡是一个带有表单(例如用户)的片段,在我单击保存后,数据被插入到数据库中。我的第二个选项卡是另一个带有表单的片段,但它使用第一个选项卡中的数据(我从数据库中获取)来填充微调器。现在,在我从第一个选项卡成功插入数据后,在我的第二个选项卡中,微调器为空。因为我的数据库查询是在第二个片段的 onCreateView() 中实现的,所以它只在应用程序启动时调用一次,所以在 tab 1 和 tab2 之间切换不会启动 onCreateView() 甚至 onResume()。对我来说有趣的是,如果我转到 tab4 然后返回到 tab2,我的数据正确地在我的微调器中,所以以某种方式从我当前的选项卡上滑动两个选项卡刷新我的片段。

编辑 我试图把 psykhi 建议的方法放在这样的地方:

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

但这对我不起作用。我错过了什么吗?

4

6 回答 6

14

我发现模拟“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 确实是您想要使用的。

于 2013-04-23T16:19:49.550 回答
13

更新:有更好的方法,请看这里:动态更新 ViewPager?


删除此答案的内容,因为这是访问Fragments inside的一种非常糟糕的方式ViewPager,请参阅上面的链接以获得更好的方法。

于 2013-02-08T13:37:56.600 回答
2

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

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

于 2013-02-08T13:02:57.983 回答
2

在片段方法中首先覆盖

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

}
于 2016-11-23T11:50:37.680 回答
1

以我的经验,ViewPagers 保持:

  • 您当前的标签
  • & 1 个选项卡在内存中的任一侧

因此,当您在 1 和 2 之间切换时,引擎盖下什么都没有发生 - 就像它们只是被隐藏/显示一样。

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

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

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

于 2016-01-21T10:30:15.753 回答
0

好的可能是一个迟到的回复,将来可能会帮助其他人,所以最近我在将数据从 db 提取到标签时遇到了同样的问题,它曾经只在我点击第三个标签时才显示。我尝试了上述解决方案,但没有任何效果。最后我遇到了Otto 这个库允许你在你的应用程序中进行通信..

只需将此库用于 yourAdapter.notifyDataSetChanged() ,无论您从数据库中获取数据..

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

于 2016-04-28T10:19:03.653 回答