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
How to load fragment data only when its tab is clicked in PagerSlidingTabStrip
提问by Aamir
I am using PagerSlidingTabStrip
in 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 onCreateView
method 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 ScholarDetailPagerAdapter
above and returned null
instead 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 在其各自的选项卡被单击并且可见时加载数据,我还尝试覆盖其以下事件并在其中编写数据加载调用:
onResume()
Not worked. Still loads data when added in activityTried overriding onHiddenChanged
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if(!hidden){ loadLectures(); }
}
onResume()
没有工作。添加到活动中时仍会加载数据尝试覆盖 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 setUserVisibleHint
event 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;
}
}