web-dev-qa-db-ja.com

PagerSlidingTabStripでタブをクリックしたときにのみフラグメントデータをロードする方法

プロジェクトで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)が含まれるようになりました。今は簡単だろうと思った。次に、上記のScholarDetailPagerAdapterpublic Fragment getItem(int arg0)を変更し、2つのフラグメントを返す代わりにnullを返しました。しかし、それは例外を引き起こしました。私はそれがポケットベルで空のビューをレンダリングすると思った..もちろん、私は間違っていました。

Fragmentがそれぞれのタブをクリックして表示されるときにデータを確実にロードするために、次のイベントをオーバーライドして、データロードコールを書き込みました。

  1. onResume()動作しません。アクティビティに追加されてもデータをロードします

  2. OnHiddenChangedをオーバーライドしようとしました

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

    }

これもうまくいきませんでした。このイベントがまったく発生しないかのようにデータはロードされません。

それ、どうやったら出来るの?ユーザーがタブをクリックしたときにフラグメントをロードするだけです。

前もって感謝します

35
Aamir

フラグメントのsetUserVisibleHintイベントをオーバーライドして、ユーザーに表示されるかどうかを確認してから、データをロードできます。次のようなもの:

boolean _areLecturesLoaded = false;

@Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
     super.setUserVisibleHint(isVisibleToUser);
     if (isVisibleToUser && !_areLecturesLoaded ) {
      loadLectures(); 
      _areLecturesLoaded = true;
     }
 }
69
Yaqub Ahmad
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;
    }
}
0
sss