2013-05-16 17 views
14

ViewPagerのユースケースが1つあります。両方向の無制限/動的ViewPager

ViewPagerは多かれ少なかれ静的な構造です。ページを右側に追加することは難しくありません(モデルに追加して表示する)が、PagerAdapter(またはそのサブクラスの一部)を展開して両方向に展開できる便利なソリューションがあるはずです。

私はコレクションのイテレータと同様に、この

boolean isEmpty() 
boolean hasNext() 
boolean hasPrevious() 
Object getNext() 
Object getPrevious() 
Object getItem(int position) 

// or if using generics 
T  getNext() 
T  getPrevious() 
T  getItem(int position) 

が、両方の方向のようなアダプタのインターフェイスを想像することができます。

ここで、インデックス/位置は0から以下に限定されないが、Integer型の全範囲を使用することができる。
配列の実装を基底としないことがあります(0から無限大)。 dynamically add and remove view to viewpager
をしかし、私は前に述べたように、私はそれが3,5、...のアイテムを維持していない、自然に働いてもらうとベースの現在の位置を変更するViewPagerを強制しようとしている:

は、私は、これは「ハック」が見つかりましたいくつかのねじれたロジックで

現在、実装が十分であるか、実装する必要がありますか?
全く新しい実装であれば、私は報酬の報酬を喜んで受け取ります。

+0

であると仮定するとウィル私のアプリの一つで。 @FoamyGuy ViewPagerのシンプルなデモをご覧ください。ここでは無制限のページ数https://github.com/FoamyGuy/MathFactCards – Pragnani

+0

@Pragnaniがありますが、あなたは右方向にしか展開していません。ハックを使わずに、双方向で動的に取得する。 –

+0

@Pragnaniあなたは無制限のページを追加できますが、1つの方向にしかありません。彼の質問は異なると思います。 – TheFlash

答えて

7

は、このヘルプ、

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return Integer.MAX_VALUE; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return getFragmentBasedOnPosition(position); 
    } 

    private Fragment getFragmentBasedOnPosition(int position) { 
     int fragmentPos = position % 3; // Assuming you have 3 fragments 
     switch(fragmentPos) { 
      case 1: 
      return Fragment1.newInstance(); 
      case 2: 
      return Fragment2.newInstance(); 
      case 3: 
      return Fragment3.newInstance(); 
     } 
    } 
} 

、その後、

mPager.setCurrentItem((int)(Integer.MAX_VALUE/2)); //我々は.. ViewPagerのビューの任意の数を追加することができますそして、私は同じことを実現しているmPagerがあなたのViewPager

+1

これはどういうわけか、おかげで助けるが、それでも私は奇妙な解決策を好きだ。 –

+3

各フラグメントを計算する必要があるため、FragmentStatePagerAdapterでは機能しません。メモリオーバーフローが発生する – Hrk

2

負の位置の値を使用すると、ViewPagerの自然な使用順序から遠く離れたアダプタの問題ではありません。非常にです。 Android SDKのサポートパッケージソースにあるViewPagerのソースコードをご覧ください。例えば、ここにsetCurrentItemInternalプライベート実装です:あなたが見ることができるように

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { 
    if (mAdapter == null || mAdapter.getCount() <= 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 
    if (!always && mCurItem == item && mItems.size() != 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 

    if (item < 0) { 
     item = 0; 
    } else if (item >= mAdapter.getCount()) { 
     item = mAdapter.getCount() - 1; 
    } 
    final int pageLimit = mOffscreenPageLimit; 
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) { 
     // We are doing a jump by more than one page. To avoid 
     // glitches, we want to keep all current pages in the view 
     // until the scroll ends. 
     for (int i=0; i<mItems.size(); i++) { 
      mItems.get(i).scrolling = true; 
     } 
    } 
    final boolean dispatchSelected = mCurItem != item; 
    populate(item); 
    scrollToItem(item, smoothScroll, velocity, dispatchSelected); 
} 

、ViewPager を明示的に負の位置の値を負うものではありません。

+0

そして結論は何ですか?私は負のインデックスを使用したくなかった。私は私のカスタムモデルに基づいて無制限の両方向のウォークスルーコレクションをする必要があります。私は直接言いました、ソリューションはおそらく配列に基づいていないはずです。負のインデックスに対処する必要があるからです。 –

+0

あなたは次のように書いています: "インデックス/位置は下の0から制限されませんが、Integer型の全範囲を使用できます。"これらのインデックスはどこで使用しますか?現在のページまたはonChangeハンドラを取得/設定する場合は、上記の問題が発生します。負のインデックスがViewPagerに表示されない場合、そのようなインデックスを持つ*意味は?詳細を教えてください... –

+0

私は可能な要素の範囲について話していましたが、インターフェイスの概要でインデックスは必要ありませんが、両方向でコレクションを動的に展開する必要があります。そのため、getPreviousItemの呼び出しはElement(0)ではなく、カスタムモデルで実装されている他の条件に依存します。 –

関連する問題