当使用ViewPager进行滑动时,Fragment不会调用OnResume()方法

9

解释我的问题:

我花了很多时间,但是无法让它工作。我在主活动中有一个包含三个片段(使用Tabhost)的视图分页器。我的ViewPagerAdapter类扩展了FragmentStatePagerAdapter

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

只有当我点击ListView项目并返回时,我的OnResume()方法才会被调用。但是当我在ListView上长按时,其他片段不会刷新。

注意:我知道这个问题以前已经问过了,但是那些解决方案都没有帮助到我。

注意2:当我的手机进入睡眠状态后,解锁手机后第二个片段调用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();


}

我的BaseAdapter中的UpdateView()方法:

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

}

以下是我应用程序的截屏,更好地了解我的问题:

在这里输入图像描述

感谢您的任何帮助。

4个回答

11

使用 setUserVisibleHint(boolean isVisibleToUser) 方法。

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

}

在片段中覆盖此方法。 - Mia
覆盖了 'androidx.fragment.app.Fragment' 中已弃用的方法。 - Reynosh

1

如果您将离屏页面限制设置为0,则在滑动OnViewCreate或OnViewCreated方法时,也会不断地调用此方法,这可能会干扰您的应用程序流程。最好的方法是在您的片段中使用接口方法覆盖,并在页面更改时调用此覆盖方法,这样就可以很好地工作。


1
您所描述的行为是ViewPager的工作方式,这没有问题。
此外,如果您检查ViewPager类的源代码,您会注意到最小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;
        }
    }
});

0
如果您的ViewPager只有两个页面,则在滑动期间,两个片段都不会暂停,并且永远不会调用onResume()。
我相信它默认情况下始终保留相邻的页面,这意味着它有一个页面限制为1。
您可以尝试将其保留的页面数设置为0。
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(0); 

请检查当您向第3页滑动并返回时,您的第一页是否会刷新,并让我知道。确保记录您的onResume()函数,因为如果您的数据没有更改,则不会注意到它正在刷新。此外,请在第二个选项卡的onResume()方法中小心。似乎您调用了notifyDataSetInvalidated()两次,这是不必要的。 - Dom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接