2013-07-30 12 views
6

oViewPager.setOffscreenPageLimit(0)を設定しても、私のビューページャーは表示ページの両側に1つずつスクリーンページを読み込みます。ViewPager.setOffscreenPageLimit(0)は何の効果もありません。 ViewPagerで一度に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(); 
     } 
    } 


} 

答えて

3

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

あなた自身でViewPagerを書きます。 Janiの答えによると、ViewPagerには、各面に1の最小オフスクリーンページ制限があります。

これはスワイプアニメーションがスムーズに動作するために必要です。それ以外の場合は、次のページのUIを設定するまで待たなければならない場合、ユーザーのスワイプはフリーズされるか、空白のコンテンツにスワイプされます。

5

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

これには、より高い数字のOffScreenPageLimitを設定する必要がありますが、フラグメントは表示されるたびに更新されます。私はLoaderを使用しonPageSelectedに各フラグメントのローダーを初期化

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) {} 
    }); 
+0

-1ポジションのフラグメント/ビューを返すgetItemメソッドはありません。 AFAIKには、現在の表示されているフラグメントを取得する方法やvisibleHintを使用する方法だけがハックされています – for3st

+0

oh、right。 'pager.getAdapter()。getItem()'を呼び出さなければなりません – edthethird

0

+0

ローダーとは何ですか? – code511788465541441

+0

答えにリンクを追加しました。 – Dante

+1

@Dante Loaderクラスを使用してonPageSelectedで使用しているコードを提供できますか? –

0

ソースコードは、カスタムすることにより、あなたのviewpagerこの

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 
のように、この方法に

を変更、その後、viewpagerのソースをコピーすることができます

/** 
* 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(); 
    } 
} 

があります

+0

' public class LazyViewPager extends ViewGroup { プライベート静的最終文字列TAG =" LazyViewPager "; プライベートstatic final boolean DEBUG = false; プライベートstatic final boolean USE_CACHE = false; プライベート静的最終整数DEFAULT_OFFSCREEN_PAGES = 0; // ViewPager 1個、所属グループを作成するフラグメント プライベートstatic final int MAX_SETTLE_DURATION = 600; // ms ... ' –

-1

これは非常に遅い答えですが、神様のために、あなたが示唆したように独自のビューページを書く必要はありません。

は最初から物事を取ることができます:

どのように動作しますviewpager:それは毎回、それを作成する必要はありませんので、それはメモリのいずれかの側に一つの項目を保持しますデフォルトでは

第一ソリューション:

mViewPager.setOffscreenPageLimit(0); 

に結果:

ページ制限0小さすぎるオフスクリーン要求されました。 1

をデフォルト第二ソリューション:

あなたはとてもメソッドを使用して、実際にユーザーに表示されたときにフラグメントを更新する:

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      //Do something like 
      //adapter.notifyDataSetChanged(); 
     } 
    } 

が、それはの誰かを役に立てば幸い未来!!!

関連する問題