8

oViewPager.setOffscreenPageLimit(0) を設定しても、ビュー ページャーは表示ページの両側に 1 つのオフスクリーン ページをロードします。

ユーザーがスライドしたときにのみページをロードするにはどうすればよいですか?

それが役立つ場合の私のアダプター:

public class MainPagerAdapter extends FragmentPagerAdapter {
    protected static final String[] CONTENT = new String[] { "page 1", "page 2", "page 3", "page 4", };

    private int mCount = CONTENT.length;

    public MainPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        //return TestFragment.newInstance(CONTENT[position % CONTENT.length]);
        return MainFragment.newInstance(position);
    }

    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
      return MainPagerAdapter.CONTENT[position % CONTENT.length];
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }


}
4

8 に答える 8

5

もう 1 つの方法は、 を使用することOnPageChangeListenerです。ページが変更されるたびに、フラグメントで refresh メソッドを呼び出します。

これにはより高い を設定する必要がありますOffScreenPageLimitが、フラグメントが表示されるたびにフラグメントが更新されます。

pager.setOnPageChangeListener(new OnPageChangeListener() {

     @Override
     public void onPageSelected(int position){
         ((MyRefreshableFragment)pager.getAdapter().getItem(position)).refresh();
     }

     @Override
     public void onPageScrolled(int arg0, float arg1, int arg2) {}
     @Override
     public void onPageScrollStateChanged(int arg0) {}
  });
于 2013-07-30T13:51:28.103 に答える
2

ユーザーがスライドしたときにのみページをロードするにはどうすればよいですか?

自分で書いてくださいViewPager。Jani's answer で指摘されViewPagerているように、オフスクリーンページの最小制限は両側に 1 です。

これは、スワイプ アニメーションがスムーズに動作するために必要です。そうしないと、次のページの UI をセットアップするのを待たなければならない場合、ユーザーのスワイプがフリーズするか、スワイプしてコンテンツを空白にするか、その UI が確立されるまでに時間がかかります。

于 2013-07-30T13:46:34.797 に答える
1

あなたはこれを行うことはできません。「要求されたオフスクリーン ページ制限 0 が小さすぎます。デフォルトは 1 です」のようなエラーが表示されます。ただし、ここで詳細を確認できます: ViewPager.setOffscreenPageLimit(0) が期待どおりに機能しない

于 2013-07-30T13:43:34.527 に答える
0

ソースコードがあります

   /**
 * Set the number of pages that should be retained to either side of the
 * current page in the view hierarchy in an idle state. Pages beyond this
 * limit will be recreated from the adapter when needed.
 *
 * <p>This is offered as an optimization. If you know in advance the number
 * of pages you will need to support or have lazy-loading mechanisms in place
 * on your pages, tweaking this setting can have benefits in perceived smoothness
 * of paging animations and interaction. If you have a small number of pages (3-4)
 * that you can keep active all at once, less time will be spent in layout for
 * newly created view subtrees as the user pages back and forth.</p>
 *
 * <p>You should keep this limit low, especially if your pages have complex layouts.
 * This setting defaults to 1.</p>
 *
 * @param limit How many pages will be kept offscreen in an idle state.
 */
public void setOffscreenPageLimit(int limit) {
    if (limit < DEFAULT_OFFSCREEN_PAGES) {//DEFAULT_OFFSCREEN_PAGES = 1
        Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
                DEFAULT_OFFSCREEN_PAGES);
        limit = DEFAULT_OFFSCREEN_PAGES;
    }
    if (limit != mOffscreenPageLimit) {
        mOffscreenPageLimit = limit;
        populate();
    }
}

ビューページャーのソースをコピーしてビューページャーをカスタマイズし、このメソッドを変更できます

このような

public class LazyViewPager extends ViewGroup {
private static final String TAG = "LazyViewPager";
private static final boolean DEBUG = false;

private static final boolean USE_CACHE = false;

private static final int DEFAULT_OFFSCREEN_PAGES = 0;//change default to load one page,no offset,ViewPager is 1,so cache 2 Fragment
private static final int MAX_SETTLE_DURATION = 600; // ms
于 2015-07-21T06:21:35.080 に答える
0

いくつかの作業ラウンドの後、これに対する解決策を見つけました。これは完璧に動作します。各タブ フラグメント クラスは、このコード ステップを実装します。

 private boolean loadData = false;

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (this.isVisible() && isVisibleToUser ) {
            loadData = true;
            // Load your data or call web services 
            performDataRequestAsyncTask();
        }
    }

および onCreateView で同じデータをロードするか、以下のように同じ Web サービスを呼び出します

     if(!loadData && YourMainFragment.yourMainFragment.getCurrentTab() == CURRENT_TAB_INDEX){
           // Load your data or call web services 
        performDataRequestAsyncTask();
      }

ビューアーページを初期化する YourMainFragment に、このメソッドを追加して currentTab を取得します

public int getCurrentTab(){
        if(mViewPager != null) return mViewPager.getCurrentItem();
        else return -1;
    }
于 2018-08-09T10:37:26.230 に答える