【问题标题】:Load selected/active tab content in view pager在视图寻呼机中加载选定/活动选项卡内容
【发布时间】:2017-03-29 09:46:21
【问题描述】:

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

我已经像这样填充了 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. 同时,一旦为该选项卡加载了我不想加载的内容 如果用户回来,从服务器再次加载它。

如何实现以上功能?

我为此做了什么:

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

  2. 然后我尝试了viewPager.setOffscreenPageLimit(0)。但它也不起作用。

请帮我解决这个问题。 谢谢

【问题讨论】:

  • 你需要覆盖public void setUserVisibleHint(boolean isVisibleToUser),你就完成了:) 请看我的回答。

标签: android android-fragments android-viewpager


【解决方案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】:

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

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

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

【讨论】:

    【解决方案3】:

    在你的片段中调用这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2015-03-12
      相关资源
      最近更新 更多