使用 ViewPager 滑动时片段不会调用 OnResume()

Fragment's are not calling OnResume() when swiping with ViewPager

解释我的问题

我花了很多时间,但我无法做到这一点 work.I 在包含三个使用 (Tabhost).My ViewPagerAdapter class 扩展 FragmentStatePagerAdapter 的主要活动中查看寻呼机。

我面临的问题是,当我滑动视图时,我的 OnResume() 方法没有被调用。我想在滑动时更新 viewpager 片段的视图。

我的 OnResume() 方法仅在我单击 ListView 项并再次单击时调用。但是当我在 ListView 上按 OnLongClick 时,其他片段不会刷新。

注意 :我知道这个问题之前有人问过,但是 none 这些解决方案帮助了我。

注意 2: 当我的 phone 进入睡眠状态然后解锁后 phone 第二个片段调用 onResume()

我的 OnResume() 第一个选项卡中的方法:

 @Override
public void onResume() {
    super.onResume();

    adapterLogin.notifyDataSetChanged();
}

我的 OnResume() 第二个选项卡中的方法:

 @Override
public void onResume() {
    super.onResume();
   adapterLogin.UpdateView(databaseHelper.getAllVoitureFavourite(1,username));
   adapterLogin.notifyDataSetInvalidated();
   adapterLogin.notifyDataSetChanged();


}

我的 UpdateView() 方法在 BaseAdapter 中:

public void UpdateView(List<Voiture> items) {
    this.voitureList = items;
    notifyDataSetInvalidated();
    notifyDataSetChanged();

}

我的应用程序的屏幕截图,以进一步了解 mu 问题:

任何帮助将不胜感激。

如果您的 ViewPager 只有 2 个页面,那么在滑动期间两个片段都不会暂停,并且永远不会调用 onResume()。

我相信默认情况下它总是保留相邻页面,这意味着它的页面限制为 1。

您可以尝试将它保留的页数设置为 0。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(0); 

您描述的行为就是 ViewPager 的工作方式,没有任何问题。

此外,如果您查看 ViewPager 的源代码 class,您会注意到最小的 offscreenPageLimit 为 1。将其设置为 0 根本没有任何作用,因为它会回退到默认值 1。

您可以添加一个 TabHost.OnTabChangeListener 以便在每次滑动时调用适当的方法。

mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
    @Override
    public void onTabChanged(String tabId) {
        switch (mTabHost.getCurrentTab()) {
            case 0:
                //fragment 1 update()
                break;
            case 1:
                //fragment 2 update()
                break;
            case 2:
                //fragment 3 update()
                break;
        }
    }
});

使用 setUserVisibleHint(boolean isVisibleToUser)。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
       // Do your stuff here
    }

}