Android 如何仅在 PagerSlidingTabStrip 中单击其选项卡时加载片段数据

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20347665/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 02:42:57  来源:igfitidea点击:

How to load fragment data only when its tab is clicked in PagerSlidingTabStrip

androidandroid-fragmentsandroid-viewpagerpagerslidingtabstrip

提问by Aamir

I am using PagerSlidingTabStripin my project and am showing data in fragments. Its a great library which works great. Each Fragment consists of a scholar's lectures which are loaded from a web service. The code to access the web service is in onCreateViewmethod of the Fragment. Currently all the fragment's data is loaded at the same time when they are added to ViewPager. I was wondering if there is any way of loading the Fragment's data only when a user clicks/swipes to a specific tab. Not everything at a time.

PagerSlidingTabStrip在我的项目中使用并以片段形式显示数据。它是一个很棒的图书馆,效果很好。每个 Fragment 都包含从 Web 服务加载的学者讲座。访问 Web 服务的代码onCreateView在 Fragment 的方法中。当前,所有片段的数据在添加到ViewPager. 我想知道是否有任何方法可以仅在用户单击/滑动到特定选项卡时加载 Fragment 的数据。一次不是全部。

Current code is pretty standard, I took help from the provided example [android solution].1

当前代码非常标准,我从提供的示例 [android 解决方案] 中获得了帮助。1

Pager Adapter is as follows:

寻呼机适配器如下:

public class ScholarDetailPagerAdapter extends FragmentPagerAdapter {

    private final String[] TITLES = { "Scholar Info", "Lectures"};
    Scholar _scholar;

    public ScholarDetailPagerAdapter(FragmentManager fm, Scholar scholar) {
        super(fm);
        _scholar = scholar;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public Fragment getItem(int arg0) {
        if(arg0 == 0)
            return ScholarsInfoFragment.netInstance(_scholar.Name, _scholar.Information, _scholar.ThumbnailUrl);
        else
            return ScholarLecturesFragment.newInstance(_scholar.ScholarId);
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

}

It returns TWO fragments, Info and Lectures. Lectures fragment calls a web service to get a scholar's lectures.

它返回两个片段,信息和讲座。讲座片段调用网络服务来获取学者的讲座。

Activity code is:

活动代码为:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the Above View
    setContentView(R.layout.tabbed_view);
    Scholar scholar = getScholar(getIntent());      

    _tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    _pager = (ViewPager) findViewById(R.id.pager);
    _adapter = new ScholarDetailPagerAdapter(getSupportFragmentManager(), scholar);

    _pager.setAdapter(_adapter);

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
            .getDisplayMetrics());
    _pager.setPageMargin(pageMargin);

    _tabs.setViewPager(_pager);
} 

I tried adding _tabs.setOnPageChangeListener(this);and ended up having onPageSelected(int arg0)in my activity as well. I thought It would be easy now. Then I modified public Fragment getItem(int arg0)in ScholarDetailPagerAdapterabove and returned nullinstead of returning two fragments. But that raised an exception. I thought It would render empty views in pager .. but of course I was wrong.

我尝试添加_tabs.setOnPageChangeListener(this);并最终也加入了onPageSelected(int arg0)我的活动。我以为现在很容易了。然后我public Fragment getItem(int arg0)ScholarDetailPagerAdapter上面修改并返回null而不是返回两个片段。但这引发了一个例外。我认为它会在寻呼机中呈现空视图......但我当然错了。

To make sure Fragment loads data when its respective tab is clicked and is visible, I also have tried overriding its following events and wrote the data loading call in them:

为了确保 Fragment 在其各自的选项卡被单击并且可见时加载数据,我还尝试覆盖其以下事件并在其中编写数据加载调用:

  1. onResume()Not worked. Still loads data when added in activity

  2. Tried overriding onHiddenChanged

    @Override   
    public void onHiddenChanged(boolean hidden) {
    
        super.onHiddenChanged(hidden);
    
        if(!hidden){
            loadLectures();
        }
    

    }

  1. onResume()没有工作。添加到活动中时仍会加载数据

  2. 尝试覆盖 onHiddenChanged

    @Override   
    public void onHiddenChanged(boolean hidden) {
    
        super.onHiddenChanged(hidden);
    
        if(!hidden){
            loadLectures();
        }
    

    }

This did not work too. No data loaded as if this event is not fired at all.

这也不起作用。没有加载数据,就好像根本没有触发此事件一样。

How do I do that? I simply want to load a fragment when user clicks on a tab.

我怎么做?我只想在用户单击选项卡时加载片段。

Thanks in advance

提前致谢

回答by Yaqub Ahmad

You could override setUserVisibleHintevent of the fragment to know if its visible to the user and then load your data. something like following:

您可以覆盖setUserVisibleHint片段的事件以了解它是否对用户可见,然后加载您的数据。类似于以下内容:

boolean _areLecturesLoaded = false;

@Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
     super.setUserVisibleHint(isVisibleToUser);
     if (isVisibleToUser && !_areLecturesLoaded ) {
      loadLectures(); 
      _areLecturesLoaded = true;
     }
 }

回答by sss

private boolean isLoaded =false,isVisibleToUser;

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    this.isVisibleToUser=isVisibleToUser;
    if(isVisibleToUser && isAdded() ){
        loadData();
        isLoaded =true;
    }
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  if(isVisibleToUser && (!isLoaded)){
        loadData();
        isLoaded=true;
    }
}