web-dev-qa-db-ja.com

PagerAdapterの開始位置

次の例を使用して、viewPagerを実装しています。 http://code.google.com/p/viewpagerexample/issues/list

この例の問題は、開始位置を設定する方法がわからないことです。デフォルトの開始位置は0です。基本的に、左または右に利用可能なビューがあるかどうかを制御することはできません。

センターのビューの現在位置を制御する方法はありますか?それを行うためのより良い方法はありますか?円形にすることは可能ですか?

66
Kirill Kulakov

クラスの外で行われる位置を設定する方法を見つけました:

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
 awesomePager.setAdapter(awesomeAdapter);
 awesomePager.setCurrentItem(CurrentPosition);

そして、私はそれに合わせたいアイテムの量を計算することによって制限することができます

154
Kirill Kulakov

FragmentStatePagerAdapterを持つViewPagerでアクティビティ(方向の変更)を再作成すると、アダプターはそのフラグメントを再利用することに気付きました。それを止める方法は:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (viewPager != null) {
        // before screen rotation it's better to detach pagerAdapter from the ViewPager, so
        // pagerAdapter can remove all old fragments, so they're not reused after rotation.
        viewPager.setAdapter(null);
    }
    super.onSaveInstanceState(savedInstanceState);
}

ただし、アクティビティの再作成後、ViewPagerは常に最初にページ0を開き、setCurrentItem(CurrentPosition);動作しません。遅延後にページを変更するための修正:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);
17
Malachiasz

最後のフラグメントから始めるために、私はこれをしました:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);
16
Helali

アダプタを設定する前に現在のアイテムを設定すると、最初に返されるアイテムが常に位置0のアイテムになるという問題に遭遇しました。

確認してください:

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

ではなく:

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);
8
DaveB

私は1000以上のサイズの配列を持っており、動的ビューページャーでは、最初のロードでスタックした左スワイプに直面していました。以下のコードはこれを解決し、スムーズなスクロールをもたらしました。

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}
6
Suhail k khan

3つのフラグメントを使用しており、アプリを起動すると、2番目のフラグメント(middle)がデフォルトで表示されます。 onResume関数を使用しているだけで、すべてうまくいきます。

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}
4
Leebeedev

同じ問題が発生しました。 ViewPagerを初期化したとき、インジケーターの位置は0でした。これは、Pagerコンテンツの計算量に依存する場合があります。以下のようにViewTreeObserverを使用します。

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mViewPager.setCurrentItem(newPosition);
        removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
    }
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

そして、

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
       if (observer == null) return;
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
               observer.removeGlobalOnLayoutListener(listener);
       } else {
               observer.removeOnGlobalLayoutListener(listener);
       }
} 

このようにして、遅延の時間設定に煩わされることもありません。

2
chanzmao
@Override
public Object instantiateItem(ViewGroup container, int position) {
    View currentPage = null;
    switch(position){
        case 0:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)    
            break;
        case 1:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)    
            ///////////// This page will be default ////////////////////
            ((ViewPager)container).setCurrentItem(position);
            ////////////////////////////////////////////////////////////
            break;
        case 2:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)    
            break;
    return currentPage;
}
1
Kvant