在视图寻呼机

时间:2017-03-29 09:46:22

标签: android android-fragments android-viewpager

我在应用程序中有一个视图寻呼机,它根据服务器上可用的内容动态填充,即视图中的标签页可变。为此,我创建了一个单独的片段,它绑定到视图寻呼机内的每个选项卡。

我已经填充了这样的viewpager:


    List lstFragments = lstFragments = new ArrayList();
    lstFragments.add(DetailsFragment.newInstance(cat.getId(), subcategoryId, cat.getName(), subcategoryName, subcategoryIconUrl));
    DetailsTabsAdapter pageAdapter = new DetailsTabsAdapter(getChildFragmentManager(), lstFragments);

    viewPager.setAdapter(pageAdapter);

默认情况下,viewpager的属性是其前一个片段和下一个片段的加载内容,但我不希望这样。

我想要实现的目标:

  1. 仅加载选定/有效标签的内容。
  2. 同时为该标签加载内容后,我不想这样做 如果用户回来,请从服务器再次加载它。
  3. 如何实现上述功能?

    我为实现这一目标所做的工作:

    1. 我已经在片段的public View onCreateView()生命周期事件中加载了服务器中的内容。内容加载正常,但它 也为其他标签加载内容。

    2. 然后我尝试了viewPager.setOffscreenPageLimit(0)。但它也没有用。

    3. 请帮我解决这个问题。 感谢

3 个答案:

答案 0 :(得分:1)

您可以在setUserVisibleHint()中覆盖一个名为Frament的方法。片段可见时调用。现在,您可以调用该服务以在该方法中加载数据。同时在同一方法中检查数据是否已加载(保存在db中),然后调用服务,否则从保存的数据中加载数据。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    // check if fragment is visible
    if (isVisibleToUser) {

    if(mdata == null){
    callService();
    } else{
    loadFromSavedDB();
    }
 }
}

答案 1 :(得分:1)

问题1

您需要实施public void setUserVisibleHint(boolean isVisibleToUser),如下所示:


boolean isDataLoaded = false;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser && !isDataLoaded ) {

            loadData();//Load data from server here
            isDataLoaded = true;
        }
    }

以上代码仅在您的片段对用户可见时加载数据,并且isDataLoaded标志确保每个片段生命周期内加载一次内容。

问题2

您需要在案例DetailsFragment中将要显示的数据存储为该片段中的全局数据,并在从服务器加载之前检查其值。也许你可以像下面的代码一样。


boolean isDataLoaded = false;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser && !isDataLoaded ) {

            loadData();//Load data from server here
            isDataLoaded = true;
        }
        else if(isDataLoaded && yourData != null)
        {
            //Load your data from cache or existing global instance here
        }
    }

答案 2 :(得分:0)

在片段中调用此

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser){
            //Do what you want here`enter code here`

        }
    }