如何仅在可见片段时调用onCreateView?

时间:2019-01-28 13:54:20

标签: java android android-viewpager

我正在使用具有5个片段的 ViewPager ,我的问题是,当第一个片段可见时,它已经加载了第二个片段。

我读到一些有关viewPager.setOffscreenPageLimit();的内容,但是其默认值是'1',并且不能设置为'0',因为 ViewPager 需要滑动动画。

因此第二个片段将始终默认加载。

但是我的问题是我在两个片段中都有一个全局Arraylist,每个片段中加载了不同的值,并且当我在片段1上时,由于调用了第二个片段,所以值被覆盖。

如何仅在用户看到该片段时才为每个片段调用onCreateView?

3 个答案:

答案 0 :(得分:1)

首先,我不会使用全局列表。如果您需要保存类似类型的列表,请创建一个baseFragment。如果您的目标是在片段之间共享筛选,则只需将应用的筛选器传递给每个片段,这样它就知道如何在加载或传递列表时管理其列表,但不要使用仅在麻烦中使用的全局变量。

第二,onCreate会在寻呼机上被有意调用,因此您可以在屏幕上显示之前预加载一些内容。这是为了提高用户从一侧向另一侧滑动时的渲染性能。如果您在滑动时加载,那将是跳动且糟糕的。

最后,除非有充分的理由,否则请考虑将逻辑移至onResume。 如果那不适合您,请监视页面更改事件,并调用在每个baseFragment上创建的共享“加载”方法,您可以在其中简单地调用和处理代码。

答案 1 :(得分:0)

使用此功能,您可以尝试一下

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
}

答案 2 :(得分:0)

即使将setOffscreenPageLimit设置为0,View分页器也将按片段加载附近。由于该值小于1,因此它们会将其设置为1。

所以onCreate,onCreateView ... on bysumes片段的onResume将在可见之前被调用。

因此,只需将数据加载到 setUserVisibleHint 中即可。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(getView() != null && isVisibleToUser){
        loadData();
    }
}

但是存在一个问题。此方法(setUserVisibleHint)将在片段的onCreate之前调用。

如果从参数获取数据。.我们将从片段的onCreate或onCreateView获取那些数据。因此,将调用第一个可见片段的setUserVisibleHint,而无需加载数据(上述方法中的 getView()!= null )。为此,我们可以使用

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater,container,savedInstanceState);

    // This is because for the first fragment to loadData, since the 
    // setUserVisibleHint is called before the onCreateView of the fragment.

    if(getUserVisibleHint()){
        loadData();
    }

    return view;
}

loadData 是将数据绑定到我片段的一部分的方法。

这样做,对于第一个可见片段,将从onCreateView调用loadData,并在片段附近从setUserVisibleHint调用。