プロジェクトでPagerSlidingTabStrip
を使用しており、データをフラグメントで表示しています。その素晴らしいライブラリは素晴らしい作品です。各フラグメントは、Webサービスから読み込まれる学者の講義で構成されます。 Webサービスにアクセスするためのコードは、フラグメントのonCreateView
メソッドにあります。現在、フラグメントのすべてのデータは、ViewPager
に追加されると同時にロードされます。ユーザーが特定のタブをクリック/スワイプしたときにのみフラグメントのデータをロードする方法があるかどうか疑問に思っていました。一度にすべてではありません。
現在のコードはかなり標準的なもので、提供されている例[Androidソリューション]から助けを借りました。 1
ポケットベルアダプタは次のとおりです。
_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;
}
}
_
2つのフラグメント、Info、およびLectureを返します。 Lectures fragmentは、Webサービスを呼び出して学者の講義を取得します。
アクティビティコード:
_@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);
}
_
_tabs.setOnPageChangeListener(this);
を追加しようとしましたが、アクティビティにもonPageSelected(int arg0)
が含まれるようになりました。今は簡単だろうと思った。次に、上記のScholarDetailPagerAdapter
のpublic Fragment getItem(int arg0)
を変更し、2つのフラグメントを返す代わりにnull
を返しました。しかし、それは例外を引き起こしました。私はそれがポケットベルで空のビューをレンダリングすると思った..もちろん、私は間違っていました。
Fragmentがそれぞれのタブをクリックして表示されるときにデータを確実にロードするために、次のイベントをオーバーライドして、データロードコールを書き込みました。
onResume()
動作しません。アクティビティに追加されてもデータをロードします
OnHiddenChangedをオーバーライドしようとしました
_@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden){
loadLectures();
}
_
}
これもうまくいきませんでした。このイベントがまったく発生しないかのようにデータはロードされません。
それ、どうやったら出来るの?ユーザーがタブをクリックしたときにフラグメントをロードするだけです。
前もって感謝します
フラグメントのsetUserVisibleHint
イベントをオーバーライドして、ユーザーに表示されるかどうかを確認してから、データをロードできます。次のようなもの:
boolean _areLecturesLoaded = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !_areLecturesLoaded ) {
loadLectures();
_areLecturesLoaded = true;
}
}
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;
}
}