4

FragmentPagerAdapterという無限の拡張子を作成しました(this siteでこれを実現する方法の例があります)。これにより、52個のフラグメント(週に1個)の50個(任意の数)のセットを反復することができ、それにより、ユーザに無限のフラグメント感を与えることができます。 ViewPager.setCurrentItemを呼び出すことによって、フラグメント間をジャンプ/スクロールするとViewPager.setCurrentItemは、smoothScrollがtrueに設定されている場合にのみ機能します

、私が見る2つのシナリオがあります。

  1. ジャンプ唯一のフラグメントのいずれかの方法 - すべてokです。これは、おそらく、のコードのためです(We are doing a jump by more than one pageで始まるコメントを探します)
  2. 複数のフラグメントでジャンプすると、setCurrentItemが呼び出された場合にのみ、新しいフラグメントが正しく表示されますsmoothScrolltrue(すなわちsetCurrentItem(i, true))に設定されている場合。

    if (smoothScroll) { 
        smoothScrollTo(destX, 0, velocity); 
        if (dispatchSelected) { 
         dispatchOnPageSelected(item); 
        } 
    } else { 
        if (dispatchSelected) { 
         dispatchOnPageSelected(item); 
        } 
        completeScroll(false); 
        scrollTo(destX, 0); 
        pageScrolled(destX); 
    } 
    

    これは私が私の深さのうち、午前ポイントです。それ以外の場合は、私が見ることができるものから、空白の画面

があるViewPager.scrollToItemがそれに次のコードを持っているので、これはおそらくです。なぜこれはif/elseが私が経験している現象を引き起こすのでしょうか?

+0

まず、あなたの 'FragmentPagerAdapter#getItem()'が適切な位置で適切に呼び出されているかどうかを調べます。何らかの理由でフラグメントを適切にロードしていないようです。おそらく3回2回呼ばれているはずです。選択した位置に1回、前後に1回。 – DeeV

+0

@Deev、私はこのアイデアをテストするためにlogcatにエントリを追加しました。結果はpastie.org/private/ybvvn5rwl1465haic6fvqにあります。 'getItem'は' setCurrentItem(i、false) '(原因不明の状況)が発生したときに3回呼び出されます。ログには 'getItem(1327)'、まだ 'newInstance(27)'があることに注意してください。これは "無限の"ビューアのためです - 1327%52 = 27 – levengli

+0

@levengi問題が何であるかわかりません。スムーススクロールが有効になっているという前提のもとに、この例があるようです。 – DeeV

答えて

2

説明はかなりシンプルです - ViewPagerは、すべての状態をアクティブに保ち続ければパフォーマンスの災害になるので、あなたのフラグメントの状態をすべて保持しません。

この場合、正確にsetOffscreenPageLimitメソッドが存在します。その目的は、ViewPagerが現在のものから左右に保持すべきフラグメントの状態の数を定義することです。背景の確認については、https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

アイドル状態のビュー階層の現在のページのいずれかの側に保持する必要があるページ数を設定します。この制限を超えるページは、必要に応じてアダプターから再作成されます。

これは最適化として提供されています。ページの数を事前に知っていて、ページに遅延ロードメカニズムを実装する必要がある場合は、この設定を調整すると、ページングアニメーションと相互作用のスムーズさが向上します。一度にアクティブにできるページ数が少ない(3-4)場合は、ユーザーページの前後で新しく作成されたビューサブツリーのレイアウトに費やされる時間が短くなります。

ページが複雑なレイアウトの場合は特にこの制限を低く抑える必要があります。我々はデフォルトの制限値を見ることができるように1

にこの設定のデフォルトは1ある - それは一つだけの断片をジャンプすることは完璧に動作する理由の答えですです。またスムーズなスクロールの場合の答えです。スムーズなスクロールで新しいアイテムを設定したい場合は、すべてのフラグメントを1つずつスクロールする必要があることを意味します。デフォルトのリミット1が機能する場合があります。

あなたのケースでは、setOffscreenPageLimit(52)を試してから、setCurrentItem(50)が正常に動作するはずです。 はお勧めできません。動作を確認するだけです。フラグメント(ネットワークからのデータのロードなど)で作業が困難な場合は、起動時に大きな遅延が発生し、すべてのフラグメントが一度に読み込まれる可能性があります。

希望に役立ちます!

+0

は魅力的に働いた。ありがとうございます – levengli

+0

よろしくお願いします! – rom4ek

関連する問題