【问题标题】:How to refresh data in ViewPager Fragments?如何刷新 ViewPager Fragments 中的数据?
【发布时间】:2016-12-14 23:20:39
【问题描述】:

我需要知道 ViewPager 中 Fragments 的生命周期吗? 我有 3 个标签的 ViewPager(3 个片段) 在它们之间滑动时的生命周期是什么?

我注意到当我从 Fragment 3 转到 Fragment 1 时,它正在被刷新。那么此时调用生命周期中的哪个方法呢?

我尝试将 Toast 放入每个方法中,但我发现它们是一个接一个地调用,所以我不知道哪个负责刷新。

我猜它是 onActivityCreated() ,但要调用它我必须通过 Bundle saveInstancestate。当我传递 null 时它会崩溃,那么如何获取这个对象?

如果有任何其他/更好的方法,请分享。 目标是当我单击操作栏中的按钮时刷新片段内的数据。

谢谢

【问题讨论】:

  • Pager 适配器的getItem 方法是否会创建片段的新实例?
  • 它什么都不做
  • 什么都不做?它必须返回一个视图或一个片段(在你的情况下可能是一个片段)。
  • 当我点击刷新按钮时我会调用它,但它什么也没做,我不确定你的意思
  • 当你从 1 到 3 时,你的 Fragment 1 被分离并被销毁,它的状态也被保存。因此,在您从 3 变为 1 之后,您的适配器再次从头开始创建片段 1,并保存状态。简而言之,所有生命周期事件都会发生。

标签: android android-fragments android-viewpager


【解决方案1】:

视图分页器片段总是在任一侧加载其邻居。

因此,您将看到片段的创建回调在它们可见之前运行。距离片段 2 页后,片段将被销毁。

让您的活动实现ViewPager.OnPageChangeListener,然后使用onPageSelected 将调用调用到您的片段中。您可以在该活动中保留对视图页面片段的引用。

 public class ViewPagerActivity implements ViewPager.OnPageChangeListener {

    public void onCreate(Bundle savedInstanceState) {
        ...
        if (savedInstanceState != null) {
           //Restore the fragment's instance
           mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent");
           ...
        }
        ...
    }

   @Override
   protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);

      //Save the fragment's instance
      getSupportFragmentManager().putFragment(outState, "mContent", mContent);
    }


    // regular activity stuff plus view pager methods

    @Override
    public void onPageSelected(int arg0) {
       final ReadyFragment fragment = mAdapter.getItem(arg0);
       if (fragment.isVisible()) {
          fragment.ready();  //method inside your custom fragment code
       }
   }
 }

添加接口类:

public interface ReadyInterface {
   public void ready();
}

在您的片段中实现该接口:

public class ReadyFragment extends Fragment implements ReadyInterface {

  //.. your regular fragment stuff

 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ...
    if (savedInstanceState != null) {
        //Restore the fragment's state here
    }
 }
 ...
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Save the fragment's state here
  }

   @Overide
   public void ready() { 
     // do your stuff here that needs to happen 
     //once fragment is displayed and running
   }

} 

【讨论】:

  • 答案解释了如何明确知道片段何时运行和显示。不断查看寻呼机销毁和创建片段。
  • 我添加了保存和恢复片段状态的东西
  • 你能帮我利用这个逻辑解决这个问题吗? stackoverflow.com/questions/41134470/…
【解决方案2】:

在您的活动中,为视图寻呼机设置适配器后,将您的代码放在 onPageSelected() 方法上。每次更改或滑动 viewPager 时都会调用它。

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多